Невозможно создать обработчик внутри потока, который не вызвал Looper.prepare () Graphhopper

Я столкнулся с следующей ошибкой.

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

Где getErrorMessage () - Невозможно создать обработчик внутри потока, который не вызывал Looper.prepare (), а logUser - это функция, которая просто показывает сообщение с тостом.

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

person Khayam Gondal    schedule 05.05.2013    source источник


Ответы (2)


Вы не можете выполнять операции пользовательского интерфейса из фонового потока.

Попробуй это:

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;
person Vishal Pawale    schedule 05.05.2013

Вам нужно создать экземпляр своего AsyncTask в основном потоке. Исходный код AsyncTask создает Handler для вызова ваших onPreExecute(), onPostExecute() и т. Д. Методов, и если этот Handler не создается в основном потоке, Android выдаст исключение, сообщающее вам, что поток, с которым Handler взаимодействует, не имел Looper.prepare() метод вызван.

person Alex Lockwood    schedule 05.05.2013