Intereting Posts
Включить OpenCV в пакет приложений для Android Как определить сделанный вызов является локальным или STD ИЛИ ISD Как изменить образец bitmapmesh, чтобы включить эффект рыбий глаз? Как правильно реализовать onRestoreInstanceState () для подкласса DialogPreference? Сделать scrollView autoscroll с перетаскиванием на Android Android – получение хэш-ключа для интеграции с Facebook Этот макет TableLayout или его родитель LinearLayout бесполезен, как разрешить это предупреждение Android Volley error.getMessage () пуст Как использовать getString () для статической строки перед onCreate ()? В частности, используя DateUtils, как мне форматировать числовую дату без какого-либо года Как Google Keep выполняет распознавание речи, одновременно сохраняя запись звука? Как опубликовать приложение для планшетов только для Android с векторными чертежами Как использовать std :: stoul и std :: stoull в Android? Музыкальное служение убито даже когда startForground Ошибка контрольной суммы при настройке Android Lollipop

Async Task Ошибка при выполнении doInBackground ()

Из моего предыдущего вопроса

Я получаю исключение NullPointor. Поэтому я сделал некоторые изменения в моем коде, и теперь индикатор выполнения появляется, но появляется ниже ошибок.

11-17 23:39:51.373: ERROR/AndroidRuntime(495): Uncaught handler: thread AsyncTask #1 exiting due to uncaught exception 11-17 23:39:51.373: ERROR/AndroidRuntime(495): java.lang.RuntimeException: An error occured while executing doInBackground() 11-17 23:39:51.373: ERROR/AndroidRuntime(495): at android.os.AsyncTask$3.done(AsyncTask.java:200) 11-17 23:39:51.373: ERROR/AndroidRuntime(495): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 11-17 23:39:51.373: ERROR/AndroidRuntime(495): at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 11-17 23:39:51.373: ERROR/AndroidRuntime(495): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 11-17 23:39:51.373: ERROR/AndroidRuntime(495): at java.util.concurrent.FutureTask.run(FutureTask.java:137) 11-17 23:39:51.373: ERROR/AndroidRuntime(495): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068) 11-17 23:39:51.373: ERROR/AndroidRuntime(495): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561) 11-17 23:39:51.373: ERROR/AndroidRuntime(495): at java.lang.Thread.run(Thread.java:1096) 11-17 23:39:51.373: ERROR/AndroidRuntime(495): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 

Код …

  public class JsonExampleActivity extends ListActivity { /** Called when the activity is first created. */ ProgressDialog mDialog; final String TAG="acb"; JSONFunction JSONfunction; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.listplaceholder); new JSONPasingShowList().execute(); } public void updateWithNewLocation(Location location2) { if(location2!=null) { double geoLat = location2.getLatitude(); double geoLng = location2.getLongitude(); } } class JSONPasingShowList extends AsyncTask<String, Integer,ArrayList<HashMap<String,String>>> { @Override protected void onPreExecute() { super.onPreExecute(); mDialog = new ProgressDialog(JsonExampleActivity.this); mDialog.setCancelable(true); mDialog.setMessage("Loading..."); mDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); mDialog.setProgress(0); mDialog.show(); } @Override protected ArrayList<HashMap<String,String>> doInBackground(String... params) { double latitude[]=new double[20]; double longitude[]=new double[20]; String reference[]=new String[20]; double distance[]=new double[20]; LocationManager locationManager; String context=Context.LOCATION_SERVICE; locationManager=(LocationManager)getSystemService(context); Criteria criteria = new Criteria(); criteria.setAccuracy(Criteria.ACCURACY_FINE); criteria.setAltitudeRequired(false); criteria.setBearingRequired(false); criteria.setCostAllowed(true); criteria.setPowerRequirement(Criteria.POWER_LOW); String provider = locationManager.getBestProvider(criteria, true); Location location = locationManager.getLastKnownLocation(provider); final LocationListener locationListener = new LocationListener() { public void onLocationChanged(Location location) { updateWithNewLocation(location); } public void onProviderDisabled(String provider){ updateWithNewLocation(null); } public void onProviderEnabled(String provider){ } public void onStatusChanged(String provider, int status, Bundle extras){ } }; updateWithNewLocation(location); locationManager.requestLocationUpdates(provider, 2000, 10, locationListener); double geoLat = location.getLatitude(); Log.v(TAG, "hiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii"+geoLat); double geoLng = location.getLongitude(); Log.v(TAG, "hiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii"+geoLng); ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>(); JSONObject json=JSONFunction.getJSONfromURL("https://maps.googleapis.com/maps/api/place/search/json?location=37.422006,-122.084095&radius=1000&types=doctor&sensor=true&key=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"); try{ JSONArray JArray = json.getJSONArray("results"); Log.v(TAG, "getting results"); for(int i=0;i<JArray.length();i++){ HashMap<String, String> map = new HashMap<String, String>(); JSONObject e = JArray.getJSONObject(i); JSONObject location1=e.getJSONObject("geometry").getJSONObject("location"); latitude[i]=location1.getDouble("lat"); longitude[i]=location1.getDouble("lng"); reference[i]=e.getString("reference"); Log.v(TAG, reference[i]); distance[i]=GetLatAndLng.gps2m(geoLat, geoLng,latitude[i] ,longitude[i]); map.put("id", String.valueOf(i)); map.put("name", "" + e.getString("name")); map.put("vicinity", "Address " + e.getString("vicinity")+" "+"Disance:"+distance[i]); mylist.add(map); } }catch(JSONException e) { Log.e("log_tag", "Error parsing data "+e.toString()); } final Intent intent=new Intent(JsonExampleActivity.this ,GetLatAndLng.class); Bundle b=new Bundle(); b.putStringArray("key", reference); intent.putExtras(b); return mylist; } @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); } protected void onPostExecute(ArrayList<HashMap<String, String>> result) { mDialog.dismiss(); ListAdapter adapter = new SimpleAdapter(JsonExampleActivity.this, result , R.layout.listview, new String[] { "name", "vicinity", }, new int[] { R.id.item_title, R.id.item_subtitle }); setListAdapter(adapter); mDialog.dismiss(); final ListView lv = getListView(); lv.setTextFilterEnabled(true); lv.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View view, int position, long id) { @SuppressWarnings("unchecked") HashMap<String, String> o = (HashMap<String, String>) lv.getItemAtPosition(position); Toast.makeText(JsonExampleActivity.this, "ID '" + o.get("id") + "' was clicked.", Toast.LENGTH_SHORT).show(); final Intent intent=new Intent(JsonExampleActivity.this ,GetLatAndLng.class); intent.putExtra("clickedid",position); startActivity(intent); } }); } public class MySimpleAdapter extends SimpleAdapter { public MySimpleAdapter(Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to) { super(context, data, resource, from, to); // TODO Auto-generated constructor stub } } } } 

Что происходит не так? Заранее спасибо!!!

 Can't create handler inside thread that has not called Looper.prepare() 

Вы получаете доступ к чему-то из потока пользовательского интерфейса изнутри doInBackground. И это не допустимо.

* Edit: Я все видел. Для меня то, что выглядит в основном необычным, это те строки:

 updateWithNewLocation(location); // What does this do? Could you tell me? locationManager.requestLocationUpdates(provider, 2000, 10, locationListener); // I don't think this is it 

Попытайтесь переместить все эти onProgressUpdate обновления местоположения в onProgressUpdate . Я слепой здесь, так как я не вижу ваш код, но я предполагаю, что он что-то делает с пользовательским интерфейсом. Попробуй это:

 @Override protected void onProgressUpdate(Location... locations) { super.onProgressUpdate(values); updateWithNewLocation(location); } 

Но, как я уже сказал, я не уверен, так как не могу знать, что делает updateWithNewLocation , если вы не updateWithNewLocation этот код здесь.

Именно поэтому полезно начинать понимать некоторые основы потоков, вместо того, чтобы просто говорить «AsyncTask» для всего, что кажется удаленно связанным с потоками в Android. Многопоточность может быть сложной, и вам нужно все продумать.

Я подозреваю, что это то, что происходит: у вас есть AsyncTask, который, помимо прочего, получает местоположение … асинхронно. Это означает, что вы начинаете в основном потоке, вы выполняете doInBackground в другом потоке неявно (поток AsyncTask), затем вы вызываете, чтобы какой поток выполнял ваше местоположение. Затем продолжается ваш поток AsyncTask, завершая всю работу, связанную с JSON, в doInBackground , возможно, заканчивая. Вероятно, поток AsyncTask заканчивается. Затем вы получаете блокировку своего местоположения, а вызванный вами прослушиватель вызывается обратно, за исключением того, что теперь AsyncTask уже завершен, а его поток больше недействителен.

Основываясь на взгляде на ваш код, я подозреваю, что вы хотите, чтобы этот API API Карт Google получил после того, как вы получили свое место, не так ли? Если это так, вызовите код «получить местоположение» синхронно. В ответ на это вы можете поместить код для запуска своей AsyncTask, которая теперь вызывает вызов и обработку API Карт Google.

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