无法在未调用 Looper.prepare() Graphhopper 的线程内创建处理程序

Posted

技术标签:

【中文标题】无法在未调用 Looper.prepare() Graphhopper 的线程内创建处理程序【英文标题】:Can't create handler inside thread that has not called Looper.prepare() Graphhopper 【发布时间】:2013-04-29 14:05:25 【问题描述】:

我遇到了以下错误。

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

其中 getErrorMessage() 是 Can't create handler inside 未调用 Looper.prepare() 的线程,而 logUser 是一个仅显示 toast congaing 消息的函数。

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();

【问题讨论】:

【参考方案1】:

您不能从后台线程执行 UI 操作。

试试这个:

GraphHopper tmpHopp = new GraphHopper().forAndroid();
tmpHopp.contractionHierarchies(true);
tmpHopp.load(mapsFolder + currentArea);
runOnUiThread(new Runnable()     
    public void run() 
        logUser("found graph with " + tmpHopp.getGraph().nodes() + " nodes");
    
);
hopper = tmpHopp;
return null;

【讨论】:

【参考方案2】:

您需要在主线程上实例化您的AsyncTaskAsyncTask源代码创建了一个Handler来调用你的onPreExecute()onPostExecute()等方法,如果那个Handler没有在主线程上实例化,Android会抛出一个异常告诉你线程Handler 与之交互的那个 Looper.prepare() 方法尚未被调用。

【讨论】:

以上是关于无法在未调用 Looper.prepare() Graphhopper 的线程内创建处理程序的主要内容,如果未能解决你的问题,请参考以下文章

无法在未调用 Looper.prepare() 的线程内创建处理程序

无法在未调用 Looper.prepare() 的线程内创建处理程序

无法在未调用 Looper.prepare()-Alertdialogbox 的线程内创建处理程序 [重复]

无法在未调用 Looper.prepare() Graphhopper 的线程内创建处理程序

原因:无法在未调用 Looper.prepare() 的线程上敬酒

运行时异常“无法在未调用 looper.prepare() 的线程内创建处理程序”