在android的開發中,如果用Handler來啓動Runable函數的run,這都知在主線程中運行,而不是新開一個線程單獨運行,這樣如果run中運行沒有結果就會影響主線程中的Activity,導致應用無響應。所以android就有一個類“HandlerThread”,通過它來新建一個子線程與主線程分開,再把這樣子線程綁定在新建的Handler對象上,這樣run函數就會在子線程中運行,而不影響Activity。
下面例子是線程來控制一個水平進度條的例子:
package com.example.taxtbarhandler01;
import android.opengl.Visibility;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;
public class Taxtnarhandler01 extends Activity {
private Button start;
private Button end;
//進度條
private ProgressBar bar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
start = (Button)findViewById(R.id.start);
end = (Button)findViewById(R.id.end);
bar = (ProgressBar)findViewById(R.id.progressBar1);
bar.setMax(100);
//輸出當前線程的名字與ID;
System.out.println("Activity-->" + Thread.currentThread().getId());
System.out.println("Activity-->" + Thread.currentThread().getName());
//start監聽器
start.setOnClickListener(new Startlistener());
end.setOnClickListener(new Endlistener());
}
Myhandler handler ;
class Startlistener implements OnClickListener{
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
//輸出當前線程的名字與ID;
System.out.println("start-->" + Thread.currentThread().getId());
System.out.println("start-->" + Thread.currentThread().getName());
bar.setVisibility(View.VISIBLE);
//創建一個子線程;
HandlerThread updata = new HandlerThread("name");
updata.start();
//把子線程綁定在handler中
handler = new Myhandler(updata.getLooper());
handler.post(r);
}
}
class Endlistener implements OnClickListener{
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
//輸出當前線程的名字與ID;
System.out.println("end-->" + Thread.currentThread().getId());
System.out.println("end-->" + Thread.currentThread().getName());
bar.setVisibility(View.GONE);
}
}
//匿名內部類
class Myhandler extends Handler{
public Myhandler(){
}
public Myhandler(Looper looper){
super(looper);
}
@Override
//從消息隊列中取出消息處理
public void handleMessage(Message msg) {
//輸出當前線程的名字與ID;
System.out.println("handler-->" + Thread.currentThread().getId());
System.out.println("handler-->" + Thread.currentThread().getName());
// TODO Auto-generated method stub
//更新進度條
bar.setProgress(msg.arg1);
//進入運行隊列
handler.post(r);
if (msg.arg1 == 100)
{
handler.removeCallbacks(r);
//注意,因爲進度條bar是在主線程中建立的,而這個函數是在子線程中運行,所以不能在這裏改變bar的狀態,否則會報錯(這是我個人理解,因爲報錯了-_-!)
// bar.setVisibility(View.GONE);
}
}
}
Runnable r = new Runnable() {
int i = 0;
@Override
public void run() {
//輸出當前線程的名字與ID;
System.out.println("run-->" + Thread.currentThread().getId());
System.out.println("run-->" + Thread.currentThread().getName());
// TODO Auto-generated method stub
System.out.println("++" + i);
i = i + 10;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//傳送消息
Message msg = handler.obtainMessage();
msg.arg1 = i;
//消息入隊列
msg.sendToTarget();
}
};
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}