Android 在PostExec上提交片段
我是Android开发新手,在提交我的片段时遇到了问题。异步任务完成后,我尝试从OnPost方法提交片段,但应用程序会销毁。如果我正常地从MapsActivity.class提交片段,那么一切都正常Android 在PostExec上提交片段,android,android-asynctask,fragment,Android,Android Asynctask,Fragment,我是Android开发新手,在提交我的片段时遇到了问题。异步任务完成后,我尝试从OnPost方法提交片段,但应用程序会销毁。如果我正常地从MapsActivity.class提交片段,那么一切都正常 @Override protected void onPostExecute(String s) { try { JSONObject jsonObject = new JSONObject(s); JSONArray j
@Override
protected void onPostExecute(String s) {
try {
JSONObject jsonObject = new JSONObject(s);
JSONArray jsonArray = jsonObject.getJSONArray("routes").getJSONObject(0).getJSONArray("legs").getJSONObject(0).getJSONArray("steps");
int count = jsonArray.length();
Log.i("Distance", jsonArray.toString());
String[] polyline_array = new String[count];
JSONObject jsonObject2;
JSONObject jsonObject3;
for (int i =0;i<count;i++){
jsonObject2 = jsonArray.getJSONObject(i);
String polygone = jsonObject2.getJSONObject("polyline").getString("points");
polyline_array[i] = polygone;
}
distancetotal = 0;
for (int i =0;i<count;i++){
jsonObject3 = jsonArray.getJSONObject(i);
String distance = jsonObject3.getJSONObject("distance").getString("value");
this.distancetotal += Double.valueOf(distance);
}
float umweg = ((totaldistance/distancetotal)-1)*100;
umwegint = (int) umweg;
MapsActivity mapsActivity = new MapsActivity();
mapsActivity.a = String.valueOf(distancetotal);
mapsActivity.c = String.valueOf(umwegint);
mapsActivity.updateUi();
int count2 = polyline_array.length;
for (int i = 0; i< count2;i++){
PolylineOptions options2 = new PolylineOptions();
options2.color(Color.GREEN);
options2.width(10);
options2.addAll(PolyUtil.decode(polyline_array[i])).geodesic(true);
mMap.addPolyline(options2);
}
} catch (JSONException e) {
e.printStackTrace();
}
}
java.lang.IllegalStateException:活动已被销毁
在
android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:2087)
位于android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:678)
位于android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:632)
在taxiapp.com.taxitracker.MapsActivity.updateUi(MapsActivity.java:607)
在taxiapp.com.taxitracker.GetDirectionsData.onPostExecute(GetDirectionsData
我猜在MapsActivity
中,通过调用GetDirectionsData
(从AsyncTask扩展而来)启动异步任务,任务完成后,将结果返回到MapsActivity`以更新UI
根本原因:这些代码行会导致应用程序崩溃
MapsActivity mapsActivity = new MapsActivity();
mapsActivity.a = String.valueOf(distancetotal);
mapsActivity.c = String.valueOf(umwegint);
mapsActivity.updateUi();
原因:在Android中,您不允许创建活动实例,系统将为您创建并调用onCreate
方法通知您活动已创建。当您创建MapsActivity
的新实例并调用updateUi
方法时,系统无法找到活动(因为您创建的活动不是系统)在任何地方,他们认为该活动可能被破坏。
解决方案:在GetDirectionsData
类中添加这些代码行
public class GetDirectionsData extends AsyncTask<String, Void, String> {
// Add this line
private WeakReference<MapsActivity> mapsActivityWeakReference;
// Add this constructor
public GetDirectionsData(MapsActivity mapsActivity) {
mapsActivityWeakReference = new WeakReference<>(mapsActivity);
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
// Your code
float umweg = ((totaldistance/distancetotal)-1)*100;
umwegint = (int) umweg;
// Remove these lines of code
/*MapsActivity mapsActivity = new MapsActivity();
mapsActivity.a = String.valueOf(distancetotal);
mapsActivity.c = String.valueOf(umwegint);
mapsActivity.updateUi();*/
// Add these lines of code instead
MapsActivity mapsActivity = mapsActivityWeakReference.get();
if (mapsActivity != null) {
mapsActivity.a = String.valueOf(distancetotal);
mapsActivity.c = String.valueOf(umwegint);
mapsActivity.updateUi();
}
int count2 = polyline_array.length;
// Your code
}
}
如果您的问题已经解决,您可以将此标记为“接受答案”,以使我在将来改进我的答案。
public class GetDirectionsData extends AsyncTask<String, Void, String> {
// Add this line
private WeakReference<MapsActivity> mapsActivityWeakReference;
// Add this constructor
public GetDirectionsData(MapsActivity mapsActivity) {
mapsActivityWeakReference = new WeakReference<>(mapsActivity);
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
// Your code
float umweg = ((totaldistance/distancetotal)-1)*100;
umwegint = (int) umweg;
// Remove these lines of code
/*MapsActivity mapsActivity = new MapsActivity();
mapsActivity.a = String.valueOf(distancetotal);
mapsActivity.c = String.valueOf(umwegint);
mapsActivity.updateUi();*/
// Add these lines of code instead
MapsActivity mapsActivity = mapsActivityWeakReference.get();
if (mapsActivity != null) {
mapsActivity.a = String.valueOf(distancetotal);
mapsActivity.c = String.valueOf(umwegint);
mapsActivity.updateUi();
}
int count2 = polyline_array.length;
// Your code
}
}
DirectionsData directionsData = new GetDirectionsData(this);
directionsData.execute();