2015-08-20 2 views
1

Я запускаю Temboo Google Distance Matrix. https://temboo.com/library/Library/Google/DistanceMatrix/DrivingDistanceMatrix/Temboo execute() Не удается создать обработчик внутри потока, который не вызвал Looper.prepare()

Так я бегу InputSet в отдельном AsyncTask, то в методе onPostExecute этого AsyncTask, я начинаю другой AsyncTask запустить ResultSet.

И причина, по которой я не ставил их в одну фоновую задачу, состоит в том, что метод .execute() ResultSet открывает другой поток (я думаю), поэтому у меня будет исключение параллелизма.

Я также не могу просто вызвать .execute() в методе onPostExecute(), потому что вы не можете делать сетевые вызовы в основном потоке.

Однако моя программа сохраняет сбой в этой линии, даже если он теперь работает в отдельном потоке:

DrivingDistanceMatrixResultSet drivingDistanceMatrixResults = drivingDistanceMatrixChoreo.execute(drivingDistanceMatrixInputSet); 

Это мой код

public class BackgroundTembooInputs extends AsyncTask<String[], Void, Void> { 
    private static DrivingDistanceMatrix drivingDistanceMatrixChoreo; 
    private static DrivingDistanceMatrixInputSet drivingDistanceMatrixInputs; 

    public BackgroundTembooInputs() { 
    } 

    @Override 
    protected Void doInBackground(String[]... params) { 
     TembooSession session = null; 
     try { 
      session = new TembooSession("accName", "appName", "appKey"); 

      drivingDistanceMatrixChoreo = new DrivingDistanceMatrix(session); 

      drivingDistanceMatrixInputs = drivingDistanceMatrixChoreo.newInputSet(); 

      drivingDistanceMatrixInputs.set_Destinations("some addr"); 
      drivingDistanceMatrixInputs.set_Origins("some addr"); 

     } catch (TembooException e) { 
      e.printStackTrace(); 
     } 

     return null; 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     BackgroundTembooOutputs backgroundTembooOutputs = new BackgroundTembooOutputs(mainWindowActivity); 
     backgroundTembooOutputs.execute(); 
    } 

    public static DrivingDistanceMatrix getDrivingDistanceMatrixChoreo() { 
     return drivingDistanceMatrixChoreo; 
    } 

    public static DrivingDistanceMatrixInputSet getDrivingDistanceMatrixInputs() { 
     return drivingDistanceMatrixInputs; 
    } 
} 

public class BackgroundTembooOutputs extends AsyncTask<Void, Void, Void> { 
    public BackgroundTembooOutputs(MainWindowActivity mainWindowActivity) { 

    } 

    @Override 
    protected Void doInBackground(Void... params) { 
     DrivingDistanceMatrix drivingDistanceMatrixChoreo = BackgroundTembooInputs.getDrivingDistanceMatrixChoreo(); 
     DrivingDistanceMatrixInputSet drivingDistanceMatrixInputSet = BackgroundTembooInputs.getDrivingDistanceMatrixInputs(); 

     try { 
      // ERROR HERE 
      DrivingDistanceMatrixResultSet drivingDistanceMatrixResults = drivingDistanceMatrixChoreo.execute(drivingDistanceMatrixInputSet); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     return null; 
    } 
} 

И Logcat:

08-20 01:35:32.163 19533-19550/edu.drexel.cs.ptn32.hw2 E/AndroidRuntime﹕ FATAL EXCEPTION: AsyncTask #1 
    Process: prog, PID: 19533 
    java.lang.RuntimeException: An error occured while executing doInBackground() 
      at android.os.AsyncTask$3.done(AsyncTask.java:304) 
      at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355) 
      at java.util.concurrent.FutureTask.setException(FutureTask.java:222) 
      at java.util.concurrent.FutureTask.run(FutureTask.java:242) 
      at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
      at java.lang.Thread.run(Thread.java:818) 
    Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 
      at android.os.Handler.<init>(Handler.java:200) 
      at android.os.Handler.<init>(Handler.java:114) 
      at android.widget.Toast$TN.<init>(Toast.java:344) 
      at android.widget.Toast.<init>(Toast.java:100) 
      at android.widget.Toast.makeText(Toast.java:258) 
      at prog.BackgroundTembooOutputs.doInBackground(BackgroundTembooOutputs.java:35) 
      at prog.BackgroundTembooOutputs.doInBackground(BackgroundTembooOutputs.java:17) 
      at android.os.AsyncTask$2.call(AsyncTask.java:292) 
      at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
            at java.lang.Thread.run(Thread.java:818) 
+0

Код и logcat – Skynet

+0

Это хорошая точка хмм. Я не уверен, и я действительно предполагал, что 'execute()' открывает новый поток, потому что я получаю сетевую ошибку, когда я вызываю ее в 'onPostExecute()' – PTN

+0

Просто добавил Logcat – PTN

ответ

1

Вы не можете сделать Toasts в AsyncTask.doInBackground (так как он не работает в потоке пользовательского интерфейса) - переместите Toast crea к AsyncTask.onPreExecute или к AsyncTask.onPostExecute

+0

О, ничего себе, у меня есть Toast in блок catch, но когда я запускал отладку, он просто разбился где-то в другом месте. – PTN

Смежные вопросы

 Смежные вопросы