解决异常Can't create handler inside thread that has not called Looper.prepare()方法

5 篇文章 0 订阅
3 篇文章 0 订阅

最近做项目时出现个问题。

在一个基类中,创建一个Handler对象用于子线程向主线程发送数据--在准备支付页面PreparePayFragment创建了一个接口(接口是另一个应用支付应用中的类型),这个接口被调用最终也是在支付应用中运行的,但是这个接口中的方法调用了这个Handler(应该说是某个异步请求中的Handler)代码如下:

<span style="font-size:14px;">private CallbackListener cListener = new CallbackListener() {
    @Override
    public void callback(int responseCode, Bundle result) {
        PayResultRequest request = new PayResultRequest(
                mainActivity, shopSerialNumScd, msgCode) {

            @Override
            public void onPostExecute(Result result) {
                String data = result.getData();
                   
            }
        };
    }
};

public MinaAsynTask(Context context, BaseRequestMessage requestMessage,int encrypt) {
    this.requestMessage = requestMessage;
    this.encrypt = encrypt;
    this.context = context;
    result = new Result();
    basehandler = new BaseHandler(requestMessage, null, encrypt, 0);         
    //mhandler=new Handler(callback); //原先创建Handler的方法
    mhandler = new Handler(context.getMainLooper(), callback);//修改后创建Handler的方法 
}

private Handler.Callback callback = new Handler.Callback() {

    @Override
    public boolean handleMessage(Message msg) {

        onPostExecute(result);
        return false;
    }

};</span>


但不知道为啥一直报错:Can't create handler inside thread that has not called Looper.prepare()。

搜索后发现,原因是此Handler没有Looper。到哪儿去找Looper呢?自己建?

在代码前加入Looper.prepare();,心想这回可以了吧?

没想到依然报错,错误显示,一个主进程只能有一个Looper。

想到主进程中肯定有Looper,Context.getMainLooper(),再看Handler的实例化时是可以指定Looper的。

于是修改了创建Handler的方法,见第二段代码注释的两句代码。

修改后运行成功。

由于这段代码在项目中应用的场景比较复杂,网上有很多这个问题的处理方法,在此copy一段进行解释,

望原创作者谅解:

非主线程中默认没有创建Looper对象,需要先调用Looper.prepare()启用Looper。
解决办法:

<span style="font-size:14px;">public void sendJson2Server(final JSONObject mJs) {        

        Handler mHandler = new Handler() {

            @Override

            public void handleMessage(Message msg) {

                super.handleMessage(msg);

                PushServiceEx.sendPublic(mTopicServer, mJs.toString());

                System.out.println(mJs.toString());                

            }

        };    

        mHandler.sendEmptyMessageDelayed(0, 5000);

//        PushServiceEx.sendPublic(mTopicServer, mJs.toString());

}


new Thread() {

    public void run() { 

        Looper.prepare();

        mPst.startPushService(); 

        mPst.sendJson2Server(qJson);//上线发消息给server 

        Looper.loop();
   }

}.start();</span>


加上上面

Looper.prepare();
Looper.loop();

 
两行即可。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值