2013-05-05 2 views
0

다음 오류가 발생했습니다.Looper.prepare()를 호출하지 않은 스레드에서 핸들러를 생성 할 수 없습니다. Graphhopper

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

어디 따라 GetErrorMessage()가 호출 Looper.prepare()와 logUser 그냥 토스트 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(); 
} 

답변

2

백그라운드 스레드에서 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; 
+0

감사합니다. –

+0

문제가 해결되면이 대답을 수락 된 것으로 표시 할 수 있습니다 –

2

당신은 메인 스레드에 AsyncTask를 인스턴스화해야합니다. AsyncTask 소스 코드는 onPreExecute(), onPostExecute() 등의 메소드를 호출하는 Handler를 생성하고, 그 Handler가 주 스레드에서 인스턴스화되어 있지 않은 경우, 안드로이드는 말하고 예외가 발생합니다 스레드가 HandlerLooper.prepare()이다 없었습니다와 상호 작용한다는 것을 메서드가 호출되었습니다.