問題描述:
在安卓4.0版本以上運行聯網程序時,常會遇到NetworkOnMainThreadException這類錯誤,初步猜測是因爲安卓自身優化所致,爲了避免主線程(UI線程)由於訪問網絡等待時間過長導致界面假死現象的發生做出的優化。
解決方式:
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();
}