天天看點

[Android]Can't create handler inside thread that has not called Looper.prepare()

版權聲明:本文為部落客原創文章,未經部落客允許不得轉載。 https://blog.csdn.net/SunnyYoona/article/details/40214419

都是因為在新開的線程中更新UI才出錯,子線程中更新主線程UI需要用到Handler.

今天有出現如下錯誤,代碼如下:

send.setOnClickListener(new OnClickListener() {  
					@Override  
		            public void onClick(View v) {  
		                new Thread(new Runnable() {  
		                    @Override  
		                    public void run() {  
		                    	Toast.makeText(getApplicationContext(), "主線程中UI", Toast.LENGTH_SHORT).show();  
		                    }  
		                });  
		            }  
		        });             
Toast.makeText(getApplicationContext(), "主線程UI", Toast.LENGTH_SHORT).show();             

都是這句話惹的禍。

把上面這行代碼也通過處理放進handler之後,錯誤就沒有了。

Handler是這麼定義的:

主要接受子線程發送的資料, 并用此資料配合主線程更新UI.

Handler的主要作用:主要用于異步消息的處理

Handler的運作過程:

當(子線程)發出一個消息之後,首先進入一個(主線程的)消息隊列,發送消息的函數即刻傳回,而在主線程中的Handler逐個的在消息隊列中将消息取出,然後對消息進行處理。這樣就實作了跨線程的UI更新(實際上還是在主線程中完成的)。

這種機制通常用來處理相對耗時比較長的操作,如通路網絡比較耗時的操作,讀取文大檔案,比較耗時的操作處理等。

繼續閱讀