Android網絡編程--問題彙總(01) NetworkOnMainThreadException

問題描述:

在安卓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();
	}	


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章