子線程常見異常

android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
誰創建的view誰纔可以修改view裏面的內容

android系統約定了一個規則:默認只有主線程纔可以修改應用程序的ui,子線程不可以(更新ui),否則拋出異常

>展示圖片、吐司


子線程更新ui的步驟
1. 創建一個消息處理器Handler(一定要在主線程new出來)
private Handler handler = new Handler() {};
2. 在子線程利用handler發送消息給主線程的消息隊列
handler.sendMessage(msg);
3. 在主線程的消息處理器裏面,處理這個消息
public void handleMessage(Message msg) {}
4. 特殊情況 傳遞數據
Message.obj 攜帶數據


public class MainActivity extends Activity {

	private TextView tv;
	/**
	 * 1.創建一個消息處理器,運行在主線程裏面.
	 */
	private Handler handler = new Handler() {
		// 3.loop調用的用來處理消息的方法,運行在主線程
		public void handleMessage(Message msg) {
			int i = (Integer) msg.obj;
			tv.setText("當前進度:"+i+"%");
		};
	};

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		tv = (TextView) findViewById(R.id.tv);
	}

	public void click(View view) {
		new Thread() {
			public void run() {
				// tv.setText("hahahah"); 子線程不可以直接更新ui
				// 2.子線程 通過消息處理器 把一個消息發送到消息隊列(message queue),消息隊列中有looper輪詢,處理消息
				for (int i = 0; i < 100; i++) {
					Message msg = new Message();
					//消息攜帶的數據
					msg.obj = i;
					handler.sendMessage(msg);
					try {
						Thread.sleep(1000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			};
		}.start();
	}
}


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