2 sachinks SachinKS 于 2013.05.09 16:15 提问

无法在线程中创建handler

错误:

logUser("An error happend while creating graph:"+ getErrorMessage());

getErrorMessage()无法在线程中创建handler,线程没有调用Looper.prepare(),而logUser 是用来显示toast信息的函数。

void prepareGraph() {
    logUser("loading graph (" + Helper.VERSION + "|" + Helper.VERSION_FILE
            + ") ... ");
    new MyAsyncTask<Void, Void, Path>() {
        protected Path saveDoInBackground(Void... v) throws Exception {
            GraphHopper tmpHopp = new GraphHopper().forAndroid();
            tmpHopp.contractionHierarchies(true);
            tmpHopp.load(mapsFolder + currentArea);
            logUser("found graph with " + tmpHopp.getGraph().nodes() + " nodes");
            hopper = tmpHopp;
            return null;
        }
        protected void onPostExecute(Path o) {
            if (hasError()) {
                logUser("An error happend while creating graph:"
                        + getErrorMessage());
            } else {
                logUser("Finished loading graph. Touch to route.");
                calcPath(52.534185, 13.348732, 52.53857,
                        13.41259);
            }
            finishPrepare();
        }
    }.execute();
}

2个回答

settlesex
settlesex   2013.05.09 16:17

同上求解,请问你解决了吗?

ce_la_vie
ce_la_vie 你看一下我的答案吧
大约 5 年之前 回复
ce_la_vie
ce_la_vie   2013.05.09 16:23

需要在主线程中实例化 AsyncTask 。AsyncTask 源代码创建一个handler来调用你的onPreExecute()onPostExecute()等方法。如果这个handler没有在主线程实例化。Android系统就会抛出异常,告诉你线程和Handler的互动缺少 Looper.prepare()方法的调用。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
关于handler在子线程中无法给activity传递信息的问题及解决办法
遇到一个问题,我在与服务器交互信息时,开启了另一个线程,并未这个线程(子线程)传入了handler,得到服务器返回的结果后,我开启了Looper,然后调用handler.sendMessage()想把message传回个主线程的activity,结果失败了,并没有传回到activity去: Looper.prepare(); Toa
Handler(原理)创建一个与线程相关的Handler
我们通常在Activity中创建的Handler,是与UI线程绑定的,这里说的绑定其实是指,Looper和MessageQueue的绑定, 而这里的线程,也就是Looper和MessageQueue所在的线程,也就是说Handler所持有的Looper和MessageQueue是 哪个线程的,我们就说,此Handler是与哪个线程绑定的。 下面先看一个例子 package co
源码角度讲解子线程创建Handler报错的原因
1. 前言众所周知,在android中,非ui线程中是不能更新ui,如果在子线程中做ui相关操作,可能会出现程序崩溃。一般的做法是,创建一个Message对象,然后Handler发送该message,然后在Handler的handleMessage()方法中做ui相关操作,这样就成功实现了子线程切换到主线程。 初始化Handler有两个地方,一个在主线程中,一个在子线程中,具体有什么区别呢,接下来
Android 子线程创建handler
据上篇我转载的 Handler,Looper, Message 三者关系深入消化,理解后。我们会很清楚地使用了子线程和Ui线程通信的问题。 即解决了一个网络请求成功或者失败后,通知ui线程更新界面的case。 但是有人会疑问,那子线程中是否可以创建一个Handler,仅仅通知线程呢? 答案是肯定的。 直接上代码。 new Thread(new Runnable() {
如何在子线程中创建Handler?
也许大家创建Handler都不陌生,但是如果要在子线程创建Handler,大家未必都能正确, 在子线程中创建handler,要确保子线程有Looper,UI线程默认包含Looper 我们需要用到一个特殊类  HandlerThread 这个类可以轻松的创建子线程handler 创建步骤: 1: 创建一个HandlerThread,即创建一个包含Looper的线程 Han
Android子线程创建Handler方法
在子线程上创建Handler
同一个现成可以创建多个handler吗
同一个现成可以创建多个handler 多个handler虽然都通用一个messageQuene 但是 发送的消息 只有发送消息的handler才能响应Toast是一种特殊的弹窗 不依赖于view、activity...
在子线程中new一个Handler
handler的作用是线程间通信 那么在子线程中new一个handler就是要有其他线程想要和他通信如果直接newThread thread=new Thread(){ @Override public void run() { super.run(); handler=new Handl
Android 直接在子线程中创建Handler为什么会报错
自从开始写代码以来,一直饱受取名之苦,这篇博客实在不知道该给它取个什么名字,总之,如果你的代码报了以下错误,说明你来对地方了 Can’t create handler inside thread that has not called Looper.prepare() 采集用户操作的事件信息,例如某个用户在何时采用了何种支付方式购买了何种产品,可以在购买成功的回调中将数据信息封装为Ma
子线程中能不能 new handler?为什么?
子线程中能不能 new handler?为什么?