import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.view.View;
import android.widget.Button;
public class MainActivity extends Activity {
private TextView textView;
private Button button;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView)findViewById(R.id.first_text);
button = (Button)findViewById(R.id.button);
button.setOnClickListener(new listener());
//打印当前线程ID
System.out.println("Thread ID:"+Thread.currentThread().getId());
}
class listener implements OnClickListener{
@Override
public void onClick(View v){
//创建新的线程
HandlerThread handlerThread = new HandlerThread("LOOPER");
handlerThread.start();
//创建handler并使handler与所指定的looper进行绑定, 即新线程的looper
//如此一来, myHandler就会在新的线程中处理looper轮询的Message
MyHandler myHandler = new MyHandler(handlerThread.getLooper());
//使Message的发送目标指定为myHandler
Message msg = myHandler.obtainMessage();
//创建Bundle数据, 并绑定到msg中发送
Bundle data = new Bundle();
data.putString("text", "Hello world");
msg.setData(data);
//发送至myHandler
msg.sendToTarget();
}
}
class MyHandler extends Handler{
public MyHandler()
{
}
public MyHandler(Looper looper)
{
super(looper);
}
@Override
//处理发送至myHandler的信息
public void handleMessage(Message msg){
//打印当前线程ID, 因为已经绑定新线程的looper, 所以ID与主线程使不一样的
System.out.println("Thread ID: " + Thread.currentThread().getId());
String result = msg.getData().getString("text");
System.out.println(result);
}
}
}
使用handler.post(new Runnable())只是执行Runnable对象中的run函数, 但依然在主线程中执行, 并不会生成新的线程.
如果要使用新的线程, 需要Thread myThread = new Thread(new Runnable()), 并调用myThread.start()方法, 才能使Runnable对象的run函数在新的线程中执行.
一些比较耗时的作业, 如下载文件, 就需要新开一个线程执行, 这样就不会影响主线程的UI界面, 避免了等下载完成才能继续操作界面的尴尬局面.