Async Tasks ist Ein Fehler aufgetreten, während der Ausführung doInBackground()
Aus meiner Vorherige Frage
War ich immer NullPointor Ausnahme. So, ich habe getan, einige Veränderungen in meinem code und nun-Fortschrittsanzeige zeigt sich aber immer unter Fehler.
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 ist...
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
}
}
}
}
Was mache ich falsch?
Vielen Dank im Voraus!!!
InformationsquelleAutor john smith | 2011-11-17
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sie sind auf etwas auf dem UI-thread aus dem inneren doInBackground. Und das ist nicht erlaubt.
*edit: ich habe alles gesehen. Zu mir, was sieht meist ungewöhnlich sind diese Zeilen:
Versuchen, um alle diejenigen, die Standort-update-Zeug in den
onProgressUpdate
. Ich bin blind, seit ich hier nicht den code sehen, aber ich bin raten es hat etwas mit der UI. Versuchen Sie dies:Aber wie gesagt, ich bin mir nicht sicher, da ich nicht wissen kann, was
updateWithNewLocation
hat, es sei denn, Sie posten, dass der code hier.Verwenden Sie Asynchrone Aufgabe in Asynchrone Aufgabe
Yeah!!!!!! danke so, jetzt viel arbeiten wie Charme.
Sie sind sehr herzlich willkommen! Ich bin froh, dass du dein problem gelöst! 🙂 Jetzt wird jemand abstimmen, so bekomme ich den Doktorhut Abzeichen, lol! 😛 nur ein Scherz, nur ein Scherz...
Jetzt neues problem auftreten GetLatAndLong Actvivty geben forceclose.Es ist ein problem des Vorsatzes.
InformationsquelleAutor davidcesarino
Dies ist genau der Grund, warum es wertvoll ist, zu verstehen, einige Grundlagen rund threading-statt nur zu sagen "AsyncTask" für alles, das scheint aus der Ferne threading-bezogene in Android. Multi-threading kann tückisch sein, und Sie haben, die Dinge zu durchdenken.
Ich vermute, dies ist, was passiert: Sie haben einen AsyncTask, die unter anderem bekommt die Lage... asynchron. Das bedeutet, dass Sie beginnen, auf dem Haupt-thread, die Sie ausführen
doInBackground
im anderen thread implizit (die AsyncTask-thread), dann rufen Sie aus, um was auch immer-thread machen Ihrer Standort-Akquisition. Dann ist dein AsyncTask-thread fährt Fort, auf, beenden Sie alle, dass die JSON-bezogene Arbeit indoInBackground
wahrscheinlich finishing. Die AsyncTask-thread wahrscheinlich beendet. Dann Sie immer Ihre Position lock, und der Hörer ist wieder aufgerufen, mit der Ausnahme, dass nun die AsyncTask ist schon fertig, und der thread ist nicht mehr gültig.Nur auf einen Blick auf deinen code, ich vermute, dass Sie wollen, dass die Google Maps-API-Aufruf nachdem Sie Ihren Standort, richtig? Wenn dem so ist, rufen Sie Ihren "get-location" code synchron. In der callback, du kannst den code zum Auftakt Ihrer AsyncTask die jetzt nur nicht die Google Maps-API-Aufruf und Verarbeitung.
InformationsquelleAutor kabuko
Du machst ein paar Sachen in Ihre
doInBackground()
dass Sie nicht brauchen, zu tun. Nur tun Sie die Sachen in IhremdoInBackground()
Methode dazu führen würde, dass das Stottern in der Regel auf der UI-thread. In anderen Worten, all den code, der nicht direkt im Umgang mit Ihrer Netzwerk-Kommunikation muss verschoben werden, aus IhremdoInBackground()
Methode.InformationsquelleAutor Kurtis Nusbaum