2016-05-20 3 views
0

Мое приложение извлекает JSON из URL-адреса и анализирует маршруты от местоположения пользователя до местоположения выбранного маркера. Отладка показывает мне, что пункт назначения и источник верны, кстати, приложение застревает, когда я добавляю полилинию на карте. Вот код:Android Добавление ломаной к карте ошибки

for(int z = 0; z<list.size()-1;z++){ 
    LatLng src= list.get(z); 
    LatLng dest= list.get(z+1); 

    PolylineOptions line= new PolylineOptions() 
     .add(src, dest) 
     .width(2) 
     .color(Color.BLUE).geodesic(true); 
     mMap.addPolyline(line); 
} 

А вот отредактированный LogCat:

05-20 11:44:04.698 26190-27044/com.example.marco.progettoquinta E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #2 
    Process: com.example.marco.progettoquinta, PID: 26190 
    java.lang.RuntimeException: An error occurred while executing doInBackground() 
     at android.os.AsyncTask$3.done(AsyncTask.java:309) 
     at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354) 
     at java.util.concurrent.FutureTask.setException(FutureTask.java:223) 
     at java.util.concurrent.FutureTask.run(FutureTask.java:242) 
     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
     at java.lang.Thread.run(Thread.java:818) 
    Caused by: java.lang.IllegalStateException: Not on the main thread 
     at maps.f.g.b(Unknown Source) 
     at maps.z.D.a(Unknown Source) 
     at maps.ag.t.a(Unknown Source) 
     at uz.onTransact(:com.google.android.gms.DynamiteModulesB:137) 
     at android.os.Binder.transact(Binder.java:387) 
     at com.google.android.gms.maps.internal.IGoogleMapDelegate$zza$zza.addPolyline(Unknown Source) 
     at com.google.android.gms.maps.GoogleMap.addPolyline(Unknown Source) 
     at com.example.marco.progettoquinta.MapsActivity.drawPath(MapsActivity.java:210) 
     at com.example.marco.progettoquinta.JSONParser.getJSONFromUrl(JSONParser.java:80) 
     at com.example.marco.progettoquinta.JSONParser.doInBackground(JSONParser.java:35) 
     at com.example.marco.progettoquinta.JSONParser.doInBackground(JSONParser.java:18) 
     at android.os.AsyncTask$2.call(AsyncTask.java:295) 
     at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234)  
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)  
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)  
     at java.lang.Thread.run(Thread.java:818)  

Это говорит о том, что источник неизвестен, но это на самом деле правильно. Конечно, этот метод реализован в AsyncTask. Где ошибка?

+0

Я попробовал свой код для добавления 'PolylineOptions' в ваш' mMap', я просто изменил 'src' и' dest' на hardcoded 'LatLng', и он отлично работает. Возможно, что-то другое вызывает эту ошибку. Вы пытались добавить журналы для значения, которое вы получаете для 'src' и' dest'? Помогло бы, если бы вы могли опубликовать дополнительные фрагменты и полные журналы. –

+0

Я пытаюсь заставить 2 LatLong, но не работает. Как вы это заработали? Что вы имеете в виду с жестким кодом? Кстати, я извлекаю Json из Asynch Task, а затем передаю значения в Main Activity, где метод, который я опубликовал, используется. Я считаю, что это проблема с потоками, но я не знаю, что делать –

+0

Я просто попытался изменить ваш '.add()' на .add (новый LatLng (-34, 151), новый LatLng (-34, 151.1)) ' затем выполнил код. Когда я проверил карту (координаты находятся вблизи Сиднея, Au), и я вижу линию. Вы пробовали входить в журналы, где вы получаете 'src' и' dest'? Посмотрите, вернули ли вы правильные значения? –

ответ

2

Исключение происходит из-за того, что вы пытаетесь изменить пользовательский интерфейс не из основного потока, а из doInBackground вашей асинтезы (что требуется для вашего запроса). Попробуйте герметизирующего код в нечто вроде этого

runOnUiThread(new Runnable() { 

    @Override 
    public void run() 
    { 
     //do your loop adding polyline 
    } 
}); 

или получить ваши данные, возвращаемые из вашего doInBackground и обработать его для добавления полилинии в OnPostExecute.

+0

Спасибо, мужчина, я тебе должен кофе. Теперь он работает без проблем. –