当前位置: 代码迷 >> Android >> Handler有关问题
  详细解决方案

Handler有关问题

热度:92   发布时间:2016-04-28 03:33:11.0
Handler问题
Handler handler=new Handler(MainActivity.this.getMainLooper()){

@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
Object s;
if ((s=msg.obj)!=null) {
fill(s.toString());
}

}
    
    };

12-04 06:53:07.007: E/AndroidRuntime(1346): FATAL EXCEPTION: main
12-04 06:53:07.007: E/AndroidRuntime(1346): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.webtest/com.example.webtest.MainActivity}: java.lang.NullPointerException
12-04 06:53:07.007: E/AndroidRuntime(1346):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1879)
12-04 06:53:07.007: E/AndroidRuntime(1346):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1980)
12-04 06:53:07.007: E/AndroidRuntime(1346):  at android.app.ActivityThread.access$600(ActivityThread.java:122)
12-04 06:53:07.007: E/AndroidRuntime(1346):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1146)
12-04 06:53:07.007: E/AndroidRuntime(1346):  at android.os.Handler.dispatchMessage(Handler.java:99)
12-04 06:53:07.007: E/AndroidRuntime(1346):  at android.os.Looper.loop(Looper.java:137)
12-04 06:53:07.007: E/AndroidRuntime(1346):  at android.app.ActivityThread.main(ActivityThread.java:4340)
12-04 06:53:07.007: E/AndroidRuntime(1346):  at java.lang.reflect.Method.invokeNative(Native Method)
12-04 06:53:07.007: E/AndroidRuntime(1346):  at java.lang.reflect.Method.invoke(Method.java:511)
12-04 06:53:07.007: E/AndroidRuntime(1346):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
12-04 06:53:07.007: E/AndroidRuntime(1346):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
12-04 06:53:07.007: E/AndroidRuntime(1346):  at dalvik.system.NativeStart.main(Native Method)
12-04 06:53:07.007: E/AndroidRuntime(1346): Caused by: java.lang.NullPointerException
12-04 06:53:07.007: E/AndroidRuntime(1346):  at android.content.ContextWrapper.getMainLooper(ContextWrapper.java:96)
12-04 06:53:07.007: E/AndroidRuntime(1346):  at com.example.webtest.MainActivity.<init>(MainActivity.java:71)
12-04 06:53:07.007: E/AndroidRuntime(1346):  at java.lang.Class.newInstanceImpl(Native Method)
12-04 06:53:07.007: E/AndroidRuntime(1346):  at java.lang.Class.newInstance(Class.java:1319)
12-04 06:53:07.007: E/AndroidRuntime(1346):  at android.app.Instrumentation.newActivity(Instrumentation.java:1023)
12-04 06:53:07.007: E/AndroidRuntime(1346):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1870)
12-04 06:53:07.007: E/AndroidRuntime(1346):  ... 11 more


------解决思路----------------------
引用:
Quote: 引用:

Quote: 引用:

不是71行嘛,可能那个getMainLooper没必要?

不写的话 
会报这个
Can't create handler inside thread that has not called Looper.prepare()

调用之前写 Looper.prepare();
会报只能有一个 looper

这样的,如果你这个handler的创建是在oncreate里,那么不会出错。
但是我估计你是在oncreate之外的。
也就是把这个当作一个内部类创建的。这样,还未oncreate的时候就尝试MainActivity.this就会造成空指针异常

我建了一个空项目试验,结果证实

public class MainActivity extends Activity {

 Handler handler=new Handler(MainActivity.this.getMainLooper())[email protected]
        public void handleMessage(Message msg) {
         // TODO Auto-generated method stub
         super.handleMessage(msg);
        }};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
    }

}



12-04 17:13:04.812: E/AndroidRuntime(25510): FATAL EXCEPTION: main
12-04 17:13:04.812: E/AndroidRuntime(25510): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.android/com.example.android.MainActivity}: java.lang.NullPointerException
12-04 17:13:04.812: E/AndroidRuntime(25510):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2303)
12-04 17:13:04.812: E/AndroidRuntime(25510):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2429)
12-04 17:13:04.812: E/AndroidRuntime(25510):  at android.app.ActivityThread.access$600(ActivityThread.java:171)
12-04 17:13:04.812: E/AndroidRuntime(25510):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1393)
12-04 17:13:04.812: E/AndroidRuntime(25510):  at android.os.Handler.dispatchMessage(Handler.java:107)
12-04 17:13:04.812: E/AndroidRuntime(25510):  at android.os.Looper.loop(Looper.java:194)
12-04 17:13:04.812: E/AndroidRuntime(25510):  at android.app.ActivityThread.main(ActivityThread.java:5468)
12-04 17:13:04.812: E/AndroidRuntime(25510):  at java.lang.reflect.Method.invokeNative(Native Method)
12-04 17:13:04.812: E/AndroidRuntime(25510):  at java.lang.reflect.Method.invoke(Method.java:525)
12-04 17:13:04.812: E/AndroidRuntime(25510):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:934)
12-04 17:13:04.812: E/AndroidRuntime(25510):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:701)
12-04 17:13:04.812: E/AndroidRuntime(25510):  at dalvik.system.NativeStart.main(Native Method)
12-04 17:13:04.812: E/AndroidRuntime(25510): Caused by: java.lang.NullPointerException
12-04 17:13:04.812: E/AndroidRuntime(25510):  at android.content.ContextWrapper.getMainLooper(ContextWrapper.java:104)
12-04 17:13:04.812: E/AndroidRuntime(25510):  at com.example.android.MainActivity.<init>(MainActivity.java:10)
12-04 17:13:04.812: E/AndroidRuntime(25510):  at java.lang.Class.newInstanceImpl(Native Method)
12-04 17:13:04.812: E/AndroidRuntime(25510):  at java.lang.Class.newInstance(Class.java:1319)
12-04 17:13:04.812: E/AndroidRuntime(25510):  at android.app.Instrumentation.newActivity(Instrumentation.java:1124)
12-04 17:13:04.812: E/AndroidRuntime(25510):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2294)
12-04 17:13:04.812: E/AndroidRuntime(25510):  ... 11 more


亲,你再认真看下,你自己看看哪个代码是先初始化的.
------解决思路----------------------
引用:
按照您说的代码 我重新改过 把handler 放到onCreate里面
然后下面就是线程调用某个方法 返回的是一串字符串
在线程调用handler时 报了如下错误
12-04 10:10:01.911: E/AndroidRuntime(1099): FATAL EXCEPTION: Thread-106
12-04 10:10:01.911: E/AndroidRuntime(1099): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
12-04 10:10:01.911: E/AndroidRuntime(1099):  at android.os.Handler.<init>(Handler.java:121)
12-04 10:10:01.911: E/AndroidRuntime(1099):  at com.example.webtest.MainActivity$2.run(MainActivity.java:67)
12-04 10:10:01.911: E/AndroidRuntime(1099):  at java.lang.Thread.run(Thread.java:856)


线程里直接用主线程的handler?
不对吧。线程是要发消息给主线程的,例如在主线程ui的修改!
你可以在new 线程的时候,给予线程一个构造函数,传入主线程的handler
例如:

        public MyThread(Handler handler)//handler是主线程的
{
this.handler=handler;//获取主线程的handler
}
        //之后在想自己想要的地方发消息给主线程
        Message msg = handler.obtainMessage(OtherMessage.GET_SUCCESS); //消息是自定义的,这里发的是空消息
        handler.sendMessage(msg); //发送消息,然后去主线程处理这个消息 

还有其他方法。。如果还是不懂可以去网上找例子
  相关解决方案