java.lang.RuntimeException: 无法销毁活动

4

在我的Android应用程序中,我在“溢出菜单”上提供了“事件选项”,而在“事件选项”上加载了地图,但当我按返回按钮时,应用程序不幸停止了。我已经发布了代码和日志记录。

AlertActivity.java

    public class Alert_activity extends Activity implements
    OnItemSelectedListener{
    Spinner s1,s2;
    TextView t1;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            // TODO Auto-generated method stub
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_alert_activity);
            getActionBar().setDisplayHomeAsUpEnabled(true);
            s1 = (Spinner)findViewById(R.id.spinner1);
            s2 = (Spinner)findViewById(R.id.spinner2);
            s1.setOnItemSelectedListener(this);
        }
        @Override
        public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2,
                long arg3) {
            // TODO Auto-generated method stub
            String sp1= String.valueOf(s1.getSelectedItem());
          //  Toast.makeText(this, sp1, Toast.LENGTH_SHORT).show();
            if(sp1.contentEquals("Events")) {
                List<String> list = new ArrayList<String>();
                list.add("Heavy Rain(mm/hr)");
                list.add("Smoke/Fog");
                list.add("Heat/Cold Wave");
                list.add("Strong Winds");
                ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this,R.layout.simple_spinner_item, list);
                dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
                dataAdapter.notifyDataSetChanged();
                s2.setAdapter(dataAdapter);

                s2.setOnItemSelectedListener(new OnItemSelectedListener() {

                    @Override
                    public void onItemSelected(AdapterView<?> adapter, View v,
                            int position, long id) {


                        // On selecting a spinner item
                        String item = adapter.getItemAtPosition(position).toString();
                        Log.d("Inside loop","inside loop");

                        // Showing selected spinner item
                        //Toast.makeText(getApplicationContext(),
                            //  "You have selected : " + item, Toast.LENGTH_LONG).show();
                        Log.d("Item",item);
                         FragmentTransaction tx = getFragmentManager()
                                    .beginTransaction();


                         if(item=="Heavy Rain(mm/hr)")
                        {
                            tx.replace(android.R.id.content, new heavyrain());
                            /*Intent in = new Intent(getApplicationContext(),
                                    MainActivity1.class);

                                startActivityForResult(in, 100);*/
                        }
                         else if(item=="Smoke/Fog")
                         {
                             tx.replace(android.R.id.content, new smoke_fog());
                         }
                         else if(item=="Heat/Cold Wave")
                         {
                             tx.replace(android.R.id.content, new smoke_fog());
                         }
                         else if(item=="Strong Winds")
                         {
                             tx.replace(android.R.id.content, new smoke_fog());
                         }
                        tx.commit();
                    }

                    @Override
                    public void onNothingSelected(AdapterView<?> arg0) {
                        // TODO Auto-generated method stub

                    }
                });

            }
            if(sp1.contentEquals("Forecast")) {
                List<String> list = new ArrayList<String>();

                list.add("Cyclone");

                ArrayAdapter<String> dataAdapter2 = new ArrayAdapter<String>(this,
                    R.layout.simple_spinner_item, list);
                dataAdapter2.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
                dataAdapter2.notifyDataSetChanged();
                s2.setAdapter(dataAdapter2);
                s2.setOnItemSelectedListener(new OnItemSelectedListener() {

                    @Override
                    public void onItemSelected(AdapterView<?> adapter, View v,
                            int position, long id) {
                        // On selecting a spinner item
                        String item = adapter.getItemAtPosition(position).toString();
                        Log.d("Inside loop","inside loop");

                        // Showing selected spinner item
                        //Toast.makeText(getApplicationContext(),
                            //  "You have selected : " + item, Toast.LENGTH_LONG).show();
                        Log.d("Item",item);
                         FragmentTransaction tx = getFragmentManager()
                                    .beginTransaction();

                        if(item=="Cyclone")
                        {
                            tx.replace(android.R.id.content, new Cyclone());
                            /*Intent in = new Intent(getApplicationContext(),
                                MapActivity.class);

                            startActivityForResult(in, 100);*/

                        }
                /*      else if(item=="Heavy Rain")
                        {
                            tx.replace(android.R.id.content, new forecast_heavyrain());

                        }
                        else if(item=="Cloudburst")
                        {
                            tx.replace(android.R.id.content, new forecast_cloudburst());

                        }*/
                        tx.commit();
                    }

                    @Override
                    public void onNothingSelected(AdapterView<?> arg0) {
                        // TODO Auto-generated method stub

                    }
                });
            }

            if(sp1.contentEquals("Nowcast")) {
                List<String> list = new ArrayList<String>();
                list.add("Heavy Rain");

                list.add("Cloudburst");
                ArrayAdapter<String> dataAdapter2 = new ArrayAdapter<String>(this,
                    R.layout.simple_spinner_item, list);
                dataAdapter2.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
                dataAdapter2.notifyDataSetChanged();
                s2.setAdapter(dataAdapter2);
                s2.setOnItemSelectedListener(new OnItemSelectedListener() {

                    @Override
                    public void onItemSelected(AdapterView<?> adapter, View v,
                            int position, long id) {
                        // On selecting a spinner item
                        String item = adapter.getItemAtPosition(position).toString();
                        Log.d("Inside loop","inside loop");

                        // Showing selected spinner item
                        //Toast.makeText(getApplicationContext(),
                            //  "You have selected : " + item, Toast.LENGTH_LONG).show();
                        Log.d("Item",item);
                         FragmentTransaction tx = getFragmentManager()
                                    .beginTransaction();

                         if(item=="Heavy Rain")
                        {
                            tx.replace(android.R.id.content, new forecast_heavyrain());
                            /*Intent in = new Intent(getApplicationContext(),
                                    MainActivity1.class);

                                startActivityForResult(in, 100);*/
                        }
                        else if(item=="Cloudburst")
                        {
                            tx.replace(android.R.id.content, new forecast_cloudburst());
                            /*Intent in = new Intent(getApplicationContext(),
                                    MainActivity1.class);

                                startActivityForResult(in, 100);*/
                        }
                        tx.commit();
                    }

                    @Override
                    public void onNothingSelected(AdapterView<?> arg0) {
                        // TODO Auto-generated method stub

                    }

                });

            }


private GoogleMap googleMap;
    PolylineOptions polylineOptions=new PolylineOptions(); 
    ArrayList<LatLng> points = new ArrayList<LatLng>();
    String lat12[] = {"30.5","31.0","31.2","31.8","30.65"};
    String long12[] = {"79.9","78.1","78.0","78.8","78.8"};
    String time11[]={"6AUG2014 20:45GMT","6AUG2014 20:45GMT","6AUG2014 20:45GMT","6AUG2014 20:45GMT","6AUG2014 22:45GMT"};
    TextView rain;
    TextView rain_lat;
    TextView rain_long;

    String[] time=new String[100];
    String[] date=new String[100];
    String[] rain_lat1=new String[100];
    String[] rain_long1=new String[100];
    String[] rad_inf1=new String[100];
    ArrayList high_rain = new ArrayList();


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
         View root = (LinearLayout) inflater.inflate(R.layout.forecast_heavyrain, container,false);
         initilizeMap();
         return root;
    }
        private void initilizeMap()
        {
            arrayPoints = new ArrayList<LatLng>();

            MapFragment fm = (MapFragment) getFragmentManager().findFragmentById(
            R.id.fragment4);
            googleMap = fm.getMap();
            googleMap.setMyLocationEnabled(true); 
            googleMap.setOnMapClickListener(this); 
            googleMap.setOnMapLongClickListener(this);


            ArrayList<NameValuePair> params = new ArrayList<NameValuePair>();
            JSONParser jsonParser = new JSONParser();
            params.add(new BasicNameValuePair("LAT", "LAT"));
            params.add(new BasicNameValuePair("LONGITUDE", "LONG"));
            Log.d("params", params.toString());
            // getting weather details by making HTTP request
            // Note that weather details url will use GET request
            JSONObject json = jsonParser.makeHttpRequest(url_Weather_details1,
                    "GET", params);
            // check your log for json response
            Log.d("Weather Details", json.toString());
            // json success tag
            int success = 0;
            try {
                success = json.getInt(TAG_SUCCESS);
            } 
            catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            if (success == 1) {
                // successfully received weather details
                JSONArray stationObj = null;
                try {
                    stationObj = json.getJSONArray(TAG_WEATHER);

                    // JSON Array

                    int lengthJsonArr = stationObj.length();
                    Log.d("length",String.valueOf(lengthJsonArr));

                    for (int i = 0; i < lengthJsonArr; i++) 
                    //for (int i = 0; i < lat12.length; i++) 
                    {
                        station = stationObj.getJSONObject(i);
                        /*String time1=station.getString(TAG_time);
                        time[i]=time1;*/

                        String lat1=station.getString(TAG_rain_lat);
                        rain_lat1[i]=lat1;

                        String long1=station.getString(TAG_rain_long);
                        rain_long1[i]=long1;

                        String date_nowcast=station.getString(TAG_date);
                        date[i]=date_nowcast;

                        String time_nowcast=station.getString(TAG_time);
                        time[i]=time_nowcast;

                        String rad_inf=station.getString(TAG_rad_inf);
                        rad_inf1[i]=rad_inf;

                    }
                //  Log.d("Length",String.valueOf(time.length));
                    int i;
                    for ( i = 0; i < lengthJsonArr; i++) 
                    {
                        //for(i=0; i<time11.length;i++)
                        //{
                        //Log.d("high rain size",String.valueOf(highest_rain.length));
                        //double high_rain2=Double.parseDouble(time[i]);


                        double lat2=Double.parseDouble(rain_lat1[i]);
                        Log.d("Latitude===>",String.valueOf(lat2));

                        double long2=Double.parseDouble(rain_long1[i]);
                        Log.d("Longitude===>",String.valueOf(long2));

                        Log.d("time_nowcast==>",time[i]);

                        Log.d("Date_nowcast==>",date[i]);
                        Log.d("Radius of influence==>",rad_inf1[i]);

                        /*t1=(TextView)getView().findViewById(R.id.rain11);
                        t1.setText(String.valueOf(high_rain2));*/

                    //    double lat2=Double.parseDouble(lat12[i]);
                    //  Log.d("Latitude===>",String.valueOf(lat2));
                    /// double long2=Double.parseDouble(long12[i]);
                    //  Log.d("Longitude===>",String.valueOf(long2));
                        //double high_rain2=Double.parseDouble(time11[i]);
                    //  Log.d("time===>",String.valueOf(time11[i])); 

                        LatLng position = new LatLng(lat2, long2);
                         CameraPosition cameraPosition;// = new CameraPosition(latLng, 0, 0, 0);
                         cameraPosition = CameraPosition.fromLatLngZoom(position, (float) 14.0);


                        Marker marker =  googleMap.addMarker(new MarkerOptions().position(new LatLng(lat2, long2)) .title(" Forecast Date: "+date[i]+" Forecast Time:"+ time[i]).snippet(" Radius of Influence:"+rad_inf1[i]+" kms").icon(BitmapDescriptorFactory.fromResource(R.drawable.heavy_rain11)));

                        points.add(position);
                    //  Log.d("i inside for loop",String.valueOf(i));


                        }



                /*  polylineOptions.addAll(points);
                    polylineOptions.color(Color.RED);
                    polylineOptions.width(7); 
                    polylineOptions.width(7); 
                    googleMap.addPolyline(polylineOptions);*/

        }

                catch (Exception e) 
                {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            else if(success==2)
            {
                Log.d("success 2","success 2");



            }
            else if(success==3)
            {
                Log.d("success 3","success 3");

            }   
}
        @Override
        public void onMapLongClick(LatLng arg0) {
            // TODO Auto-generated method stub

        }
        @Override
        public void onMapClick(LatLng arg0) {
            // TODO Auto-generated method stub

        }
        public void onDestroyView() 
         {
                 super.onDestroyView(); 
                 Fragment fragment = (getFragmentManager().findFragmentById(R.id.fragment4));  
                 FragmentTransaction ft = getActivity().getFragmentManager().beginTransaction();
                 ft.remove(fragment);
                 ft.commit();
                 super.onDestroy();
         }
        @Override
        public void onDetach() {
            super.onDetach();

            try {
                Field childFragmentManager = Fragment.class.getDeclaredField("mChildFragmentManager");
                childFragmentManager.setAccessible(true);
                childFragmentManager.set(this, null);

            } catch (NoSuchFieldException e) {
                throw new RuntimeException(e);
            } catch (IllegalAccessException e) {
                throw new RuntimeException(e);
            }
        }

        }    
    }

    @Override
    public void onNothingSelected(AdapterView<?> arg0) {
        // TODO Auto-generated method stub

    }
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.items, menu);

        return super.onCreateOptionsMenu(menu);

    }
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        super.onOptionsItemSelected(item);

        switch(item.getItemId()){
            case R.id.exit:
                android.os.Process.killProcess(android.os.Process.myPid());
                System.exit(1);

            case R.id.Feedback:
                LocationFound();
                return true;

            case R.id.Events:
                Alert();
                return true;


            case android.R.id.home:
                finish();



        }

        return true;
    }
    private void LocationFound() {
        Intent in = new Intent(getApplicationContext(),Feedback.class);
        startActivityForResult(in, 100);
    }
    private void Alert() {
        Intent in = new Intent(getApplicationContext(),Alert_activity.class);
        startActivityForResult(in, 100);
    }


    @Override
    public void onBackPressed() { //here I capture the event onBackPress 
        super.onBackPressed(); 
        onStop(); //call onStop
    }

}

日志记录器

    02-01 08:27:22.651: E/AndroidRuntime(12401): FATAL EXCEPTION: main
    02-01 08:27:22.651: E/AndroidRuntime(12401): Process: com.example.gpstracking, PID: 12401
    02-01 08:27:22.651: E/AndroidRuntime(12401): java.lang.RuntimeException: Unable to destroy activity {com.example.gpstracking/com.example.gpstracking.Alert_activity}: java.lang.IllegalStateException: Activity has been destroyed
    02-01 08:27:22.651: E/AndroidRuntime(12401):    at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3515)
    02-01 08:27:22.651: E/AndroidRuntime(12401):    at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:3533)
    02-01 08:27:22.651: E/AndroidRuntime(12401):    at android.app.ActivityThread.access$1400

为什么你在 onBackPressed 中调用了 onStop(); - ρяσѕρєя K
如果我把它移除了,问题依然存在... - Girish Patel
是的,即使我删除了它,错误仍然相同...我认为问题出在片段上...但我无法解决它... - Girish Patel
尝试移除 onDestroyView 方法。当它已经被销毁时,您无法使用 getActivity() - Rohit5k2
我必须在不同的Fragment中显示地图...所以,即使我移除了销毁视图,应用程序也会停止...实际上,这个问题只出现在Android版本4.4及更高版本上...对于其他版本,它可以正常工作...如果你能帮我写出代码,那就太好了...非常感谢你... - Girish Patel
1个回答

1

尝试在onBackPressed()方法中使用此代码,而不是调用onStop():

@Override
    public void onBackPressed(){
        moveTaskToBack(true);
    }

希望这能有所帮助!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接