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() .