无法在未调用 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】:您需要在主线程上实例化您的AsyncTask
。 AsyncTask
源代码创建了一个Handler
来调用你的onPreExecute()
、onPostExecute()
等方法,如果那个Handler
没有在主线程上实例化,Android会抛出一个异常告诉你线程Handler
与之交互的那个 Looper.prepare()
方法尚未被调用。
【讨论】:
以上是关于无法在未调用 Looper.prepare() Graphhopper 的线程内创建处理程序的主要内容,如果未能解决你的问题,请参考以下文章
无法在未调用 Looper.prepare() 的线程内创建处理程序
无法在未调用 Looper.prepare() 的线程内创建处理程序
无法在未调用 Looper.prepare()-Alertdialogbox 的线程内创建处理程序 [重复]
无法在未调用 Looper.prepare() Graphhopper 的线程内创建处理程序