問題描述:
在安卓4.0版本以上運作聯網程式時,常會遇到NetworkOnMainThreadException這類錯誤,初步猜測是因為安卓自身優化所緻,為了避免主線程(UI線程)由于通路網絡等待時間過長導緻界面假死現象的發生做出的優化。
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0NXYFhGd192UvwVe0lmdhJ3ZvwFM38CXlZHbvN3cpR2Lc1TPB10QGtWUCpEMJ9CXsxWam9CXwADNvwVZ6l2c052bm9CXUJDT1wkNhVzLcRnbvZ2Lc1TPnVGNKNDWww2RhZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39jN1YzNxcjM1ETMykDM0EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
解決方式:
1.直接忽視掉,不推薦使用,限于在調試時臨時使用
在聯網activity中,嵌入下面代碼即可解決。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (android.os.Build.VERSION.SDK_INT > 9) {
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
}
}
2.開啟另一個線程,避免UI線程阻塞假死
寫一個内部類實作Runnable接口
private Runnable runnable = new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
try {
ChatClient.getDataOutputStream().writeUTF(ChatClient.getSocket().getInetAddress().getHostAddress());
ChatClient.getDataOutputStream().writeUTF("{GETALL}");
String response = ChatClient.getDataInputStream().readUTF();
mUsers = response.split(";");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_spinner_item, mUsers);
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
userList.setAdapter(adapter);
}
};
然後在onCreate中啟動該線程
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
new Thread(runnable).start();
}