天天看點

Android網絡程式設計--問題彙總(01) NetworkOnMainThreadException

問題描述:

在安卓4.0版本以上運作聯網程式時,常會遇到NetworkOnMainThreadException這類錯誤,初步猜測是因為安卓自身優化所緻,為了避免主線程(UI線程)由于通路網絡等待時間過長導緻界面假死現象的發生做出的優化。

Android網絡程式設計--問題彙總(01) NetworkOnMainThreadException

解決方式:

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