使用Handler管理线程(转)
步骤:
1. 申请一个Handler对象
Handler handler = new Handler();
2. 创建一个线程
{继承Thread类或者实现Runnable这个接口}
使用Runnable创建一个内部匿名类对象updateThread(要复写run方法)
3. 使用handler的post方法将线程加入到线程队列中
handler.post(updateThread);
4. 使用handler的removeCallbacks方法移出updateThread线程
注意:如果线程从线程队列中出来被执行后,则队列中就不在有线程
因此如果线程在被执行后没有方法将其再次加入到队列中,则无需使用removeCallbacks
线程走出线程队列有两种情况:
一种是被执行,此时要执行run方法
一种是使用removeCallbacks方法,此时线程不被执行,因此不调用run
5. 使用handler的postDelayed方法延时将线程加入到队列中
handler.postDelayed(updateThread,3000)
以下代码是MainActivity.java中的代码
package com.example.handler; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class MainActivity extends Activity { //声明两个按钮控件 private Button StartButton = null; private Button EndButton = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //根据控件的ID得到代表控件的对象,并为这两个按钮设置相应的监听器 StartButton = (Button)findViewById(R.id.StartButton); StartButton.setOnClickListener(new StartButotnListener()); EndButton = (Button)findViewById(R.id.EndButton); EndButton.setOnClickListener(new EndButtonListener()); } class StartButotnListener implements OnClickListener{ @Override public void onClick(View v) { // TODO Auto-generated method stub handler.post(updateThread); } } class EndButtonListener implements OnClickListener{ @Override public void onClick(View v) { // TODO Auto-generated method stub handler.removeCallbacks(updateThread); } } //创建一个Handler对象 Handler handler = new Handler(); //将要执行的操作下载线程对象的run方法当中 Runnable updateThread = new Runnable(){ public void run(){ System.out.println("UpdateThread"); //在run方法内部,执行postDelayed或者是post方法 handler.postDelayed(updateThread,3000); } }; }
以下代码是activity_main.xml中的代码
<LinearLayout xmlns:andro>
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/LinearLayout1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
tools:context="${relativePackage}.${activityClass}" >
<Button
android:id="@+id/StartButton"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Start"
/>
<Button
android:id="@+id/EndButton"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="End"
/>
</LinearLayout>
对比请看http://blog.sina.com.cn/s/blog_78c913e30100uqmf.html
以下代码是MainActivity.java中的代码
package com.example.handlertest;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
public class MainActivity extends Activity {
private Handler handler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
handler.post(r);
//Thread t = new Thread(r);
//t.start();
System.out.println("activity--->"+ Thread.currentThread().getId());
System.out.println("activityname--->"+ Thread.currentThread().getName());
}
Runnable r = new Runnable(){
public void run() {
System.out.println("handler--->"+ Thread.currentThread().getId());
System.out.println("handlername--->"+ Thread.currentThread().getName());
try{
Thread.sleep(10000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
}
};
}
以下代码是activity_main.xml中的代码
<LinearLayout xmlns:andro
xmlns:tools="http://schemas.android.com/tools"
android:
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="${relativePackage}.${activityClass}" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
</LinearLayout>