http://lvg2010.blog.51cto.com/1318947/503935

在android中,用户自己创建的工作线程和UI主线程是不同的线程。handler 是android中一种消息的异步处理机制。在用户未给自己的工作线程创建Looper,即默认情况下,handler 会在主线程的Looper下进行消息处理,这时handler占用主线程。

当用户在启动自己的工作线程时调用Looper.prepare(),这时创建了自己的Looper,当我们利用handler进行消息处理时,自己的工作线程将和主线程不是同一个线程。代码如下:

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class Demo1 extends Activity{

private Button button1,button2;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.main2);
button1=(Button)findViewById(R.id.button1);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
MyThread myThread=new MyThread();
myThread.start();
Log.i("main Thread UI id:",Thread.currentThread().getId()+"");
}
});
}


class MyHandler extends Handler {

public MyHandler(Looper looper){
super(looper);
}

@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.handleMessage(msg);
Log.i("handler thread id:",Thread.currentThread().getId()+"");
}
}

class MyThread extends Thread {
private MyHandler myHandler;
private String obj;
public void run(){
Looper myLopper ;
Looper.prepare();
myLopper=Looper.myLooper();
myHandler=new MyHandler(myLopper);
Log.i("my thread id:",""+Thread.currentThread().getId());
obj="my thread";
myHandler.removeMessages(0);
Message message=myHandler.obtainMessage(1,1,1,obj);
myHandler.sendMessage(message);
Looper.loop();

}

}

}

运行结果如下:

I/main Thread UI id:( 725): 1
I/my thread id:( 725): 8
I/handler thread id:( 725): 8

由此可见,当我们创建自己的Looper时,系统的handler将占用用户的工作线程。




更多相关文章

  1. Android初识多线程
  2. android 线程优先级设置
  3. Android消息机制---MessageQueue的工作原理
  4. android C++ 和 jni,根据JNIEnv的FindClass获取java类,包括多线程
  5. Android处理线程暂停与恢复
  6. 体育迷的工作:安卓开发,上海,国内排名第一体育平台
  7. android如何在子线程中更新UI
  8. android一个简单的线程实例
  9. Android强制在主线程进行网络请求

随机推荐

  1. Android(安卓)VectorDrawable与SVG 实现
  2. Android——PullToRefresh自动刷新
  3. android下hci log
  4. Android之MVVM架构指南(五):ViewModel
  5. JWT在Java和Android中的使用
  6. android中OkHttp的导入和get、post请求的
  7. react-native启动android service bug解
  8. 属性动画(Property Animation)
  9. Android加载Class的思考
  10. Android(安卓)Studio上使用OpenCV-androi