Async Task Une erreur s'est produite lors de l'exécution de doInBackground()
De mon question précédente
Je recevais NullPointor exception. J'ai donc fait quelques modifications dans mon code et maintenant, la barre de progression s'affiche mais trouver ci-dessous les erreurs.
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()
Code est...
public class JsonExampleActivity extends ListActivity {
/** Called when the activity is first created. */
ProgressDialog mDialog;
final String TAG="a.c.b";
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
}
}
}
}
Ce qui ne va pas?
Merci à l'Avance!!!!!
OriginalL'auteur john smith | 2011-11-17
Vous devez vous connecter pour publier un commentaire.
Vous accédez à quelque chose sur le thread de l'INTERFACE utilisateur de l'intérieur doInBackground. Et ce n'est pas permis.
*edit: j'ai tout vu. Pour moi, ce qui semble à première vue peu commun sont ces lignes:
Essayez de déplacer tous ces emplacement de mise à jour des trucs dans le
onProgressUpdate
. Je suis aveugle ici puisque je ne peux pas voir ton code, mais je suis deviner il fait quelque chose avec l'INTERFACE utilisateur. Essayez ceci:Mais comme je l'ai dit, je ne suis pas sûr car je ne peux pas savoir ce que
updateWithNewLocation
ne à moins que vous poste le code ici.Utiliser Asynchrone de Tâche en tâche Asynchrone
Ouais!!!!!! merci beaucoup maintenant travailler comme un charme.
Vous êtes les bienvenus! Je suis heureux que vous ayez résolu votre problème! 🙂 Maintenant, quelqu'un vote que si je reçois le Mortier! insigne de lol! 😛 plaisanterie, plaisanterie...
Maintenant nouveau problème se produit GetLatAndLong Actvivty donnant forceclose.C'est un problème de volonté.
OriginalL'auteur davidcesarino
C'est exactement pourquoi il est précieux pour commencer à comprendre quelques notions de base autour de thread au lieu de dire "AsyncTask" pour tout ce qui semble à distance filetage liées à Android. Le Multi-threading peut être difficile et vous devez penser les choses à travers.
Je suppose que c'est ce qui se passe: Vous avez une AsyncTask qui, entre autres choses, devient le lieu... de manière asynchrone. Cela signifie que vous démarrez sur le thread principal, vous exécutez
doInBackground
dans un autre thread implicitement (les AsyncTask fil), puis vous appeler à ce thread est de faire votre acquisition de la position. Ensuite, votre AsyncTask thread continue sur, finir tout ce que JSON liées à l'doInBackground
, probablement de finition. L'AsyncTask thread susceptibles de finitions. Puis vous êtes l'obtention de votre emplacement de verrouillage, et la position d'écoute que vous avez fourni est appelé en arrière, sauf que maintenant les AsyncTask est déjà fini, et son thread n'est plus valide.Juste, fondée sur un coup d'oeil à ton code, je soupçonne que vous voulez faire que de l'API Google Maps appel après que vous obtenez votre emplacement, à droite? Si oui, appelez votre "avoir lieu" code de manière synchrone. Dans le rappel, vous pouvez mettre le code pour le coup d'envoi de votre AsyncTask qui désormais ne l'API Google Maps appel et de traitement.
OriginalL'auteur kabuko
Vous êtes en train de faire un tas de trucs dans votre
doInBackground()
que vous n'avez pas besoin de le faire. Seulement les choses dans votredoInBackground()
méthode qui serait la cause du bégaiement sur le thread d'INTERFACE utilisateur. En d'autres termes, tout le code qui ne traitent pas directement de votre réseau de communication doit être déplacé hors de votredoInBackground()
méthode.OriginalL'auteur Kurtis Nusbaum