Android中,子線程使用主線程中的組件出現問題的解決方法 ...
Android中,主線程中的組件,不能被子線程調用,否則就會出現異常。
這裡所使用的方法就是利用Handler類中的Callback(),接受線程中的Message類發來的消息,然後把所要線上程中執行的功能交由Handler類來處理。這樣就解決了線程出現的問題。
下麵測試實例功能為單擊圖片,圖片透明度改變為50,300毫秒後恢復不透明,代碼如下:
public class Demo extends Activity{
private ImageView changeImg = null;//ImageView組件
Handler handler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
if(msg.what==0) {***//發來的Message的識別號***
changeImg.setImageAlpha(255);**//設置圖片的透明度為255,也就是不透明**
}
return false;
}
});
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
**changeImg = (ImageView) findViewById(R.id.change_img);**//綁定圖片組件
}
private class OnClick implements View.OnClickListener{//繼承單擊監聽類
@Override
public void onClick(View v) {
changeImg.setImageAlpha(50);//設置changeImg透明度
Toast.makeText(MainActivity.this, "該功能暫時還沒開發,敬請期待!", Toast.LENGTH_SHORT).show();
new Thread() {//延遲恢復changeImg的狀況
public void run(){
try {
sleep(300);//延遲300毫秒
Message msg = new Message();//聲明並實例化一個Message類,用於通知Handler執行功能
msg.what=0;//msg對象的標識號
handler.sendMessage(msg);//發送msg對象,這樣會執行Callbak()事件
} catch (InterruptedException e) {//拋出異常
e.printStackTrace();
}
}
}.start();
}
}