版權聲明:本文為部落客原創文章,未經部落客允許不得轉載。 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更新(實際上還是在主線程中完成的)。
這種機制通常用來處理相對耗時比較長的操作,如通路網絡比較耗時的操作,讀取文大檔案,比較耗時的操作處理等。