Android 在PostExec上提交片段

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

我是Android开发新手,在提交我的片段时遇到了问题。异步任务完成后,我尝试从OnPost方法提交片段,但应用程序会销毁。如果我正常地从MapsActivity.class提交片段,那么一切都正常

 @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();