package org.lzm.android.handler;import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.SeekBar;public class HandlerThreadDemo extends Activity implements OnClickListener{

private static final String TAG = "HandlerThreadDemo";

private Button startBtn = null;

private SeekBar bar = null;

HandlerThread mThread = new HandlerThread("handlerThread");

Handler mHhandler = new Handler(mThread.getLooper());这为什么有空,mThread.getLooper为什么不取到looper Message msg  = mHhandler.obtainMessage();

Bundle bundle = new Bundle();

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        startBtn = (Button) findViewById(R.id.button1);
        bar = (SeekBar) findViewById(R.id.seekBar1);
        System.out.println();
        
    } public void onClick(View v) {
if (v == startBtn) {
bar.setVisibility(View.VISIBLE);
mThread.start();
bundle.putInt("id", 1);
bundle.putString("name", "liziming");
msg.setData(bundle);
msg.sendToTarget();
System.out.println(bundle.getInt("id")+":"+bundle.getString("name"));
// Message msg  = mHhandler.obtainMessage();

}
}
}08-01 01:52:39.401: ERROR/AndroidRuntime(424): FATAL EXCEPTION: main
08-01 01:52:39.401: ERROR/AndroidRuntime(424): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{org.lzm.android.handler/org.lzm.android.handler.HandlerThreadDemo}: java.lang.NullPointerException
08-01 01:52:39.401: ERROR/AndroidRuntime(424):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2585)
08-01 01:52:39.401: ERROR/AndroidRuntime(424):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
08-01 01:52:39.401: ERROR/AndroidRuntime(424):     at android.app.ActivityThread.access$2300(ActivityThread.java:125)
08-01 01:52:39.401: ERROR/AndroidRuntime(424):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
08-01 01:52:39.401: ERROR/AndroidRuntime(424):     at android.os.Handler.dispatchMessage(Handler.java:99)
08-01 01:52:39.401: ERROR/AndroidRuntime(424):     at android.os.Looper.loop(Looper.java:123)
08-01 01:52:39.401: ERROR/AndroidRuntime(424):     at android.app.ActivityThread.main(ActivityThread.java:4627)
08-01 01:52:39.401: ERROR/AndroidRuntime(424):     at java.lang.reflect.Method.invokeNative(Native Method)
08-01 01:52:39.401: ERROR/AndroidRuntime(424):     at java.lang.reflect.Method.invoke(Method.java:521)
08-01 01:52:39.401: ERROR/AndroidRuntime(424):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
08-01 01:52:39.401: ERROR/AndroidRuntime(424):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
08-01 01:52:39.401: ERROR/AndroidRuntime(424):     at dalvik.system.NativeStart.main(Native Method)
08-01 01:52:39.401: ERROR/AndroidRuntime(424): Caused by: java.lang.NullPointerException
08-01 01:52:39.401: ERROR/AndroidRuntime(424):     at android.os.Handler.<init>(Handler.java:157)
08-01 01:52:39.401: ERROR/AndroidRuntime(424):     at org.lzm.android.handler.HandlerThreadDemo.<init>(HandlerThreadDemo.java:24)
08-01 01:52:39.401: ERROR/AndroidRuntime(424):     at java.lang.Class.newInstanceImpl(Native Method)
08-01 01:52:39.401: ERROR/AndroidRuntime(424):     at java.lang.Class.newInstance(Class.java:1429)
08-01 01:52:39.401: ERROR/AndroidRuntime(424):     at android.app.Instrumentation.newActivity(Instrumentation.java:1021)
08-01 01:52:39.401: ERROR/AndroidRuntime(424):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2577)
08-01 01:52:39.401: ERROR/AndroidRuntime(424):     ... 11 more

解决方案 »

  1.   

    HandlerThread创建时是没Looper的 要创建之后才有,也就是调用Looper.prepare()创建一个Looper实例之后。
    要不然返回null
      

  2.   

    public Looper getLooper () 
    Since: API Level 1 This method returns the Looper associated with this thread. If this thread not been started or for any reason is isAlive() returns false, this method will return null. If this thread has been started, this method will block until the looper has been initialized. 不明白这个API?
      

  3.   

    明白了。我必须调用mThread.start()后才可以取到looper对象。
      

  4.   

    Java语言  好久不用 都忘记了
      

  5.   


    是的mThread.start()之后到线程run方法结束isAlive才返回true,其他情况isAlive()返回false。
    getLooper方法就返回null了,线程开启后如果looper没初始化getLooper也会被阻塞。
      

  6.   

    在API中为什么looper类没有构造函数呀??