【问题标题】:Getting android.app.FragmentManagerImpl.execPendingActions exception while exiting the app退出应用程序时获取 android.app.FragmentManagerImpl.execPendingActions 异常
【发布时间】:2015-04-14 04:56:12
【问题描述】:

退出应用程序时出现以下异常。我的应用程序包含一个导航抽屉。每一个drawer的item都是一个fragment。我在一个片段中有一张地图,其他片段包含简单的布局。我在 mainactivity 中处理了背压并在那里完成了活动。但是当我从地图片段返回时,我的应用程序崩溃了(在地图片段中,我只是获取当前位置)。这是我得到的堆栈跟踪:

04-14 10:20:40.822: E/AndroidRuntime(17446): FATAL EXCEPTION: main
04-14 10:20:40.822: E/AndroidRuntime(17446): java.lang.NullPointerException
04-14 10:20:40.822: E/AndroidRuntime(17446):    at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1372)
04-14 10:20:40.822: E/AndroidRuntime(17446):    at android.app.FragmentManagerImpl$1.run(FragmentManager.java:426)
04-14 10:20:40.822: E/AndroidRuntime(17446):    at android.os.Handler.handleCallback(Handler.java:615)
04-14 10:20:40.822: E/AndroidRuntime(17446):    at android.os.Handler.dispatchMessage(Handler.java:92)
04-14 10:20:40.822: E/AndroidRuntime(17446):    at android.os.Looper.loop(Looper.java:137)
04-14 10:20:40.822: E/AndroidRuntime(17446):    at android.app.ActivityThread.main(ActivityThread.java:4745)
04-14 10:20:40.822: E/AndroidRuntime(17446):    at java.lang.reflect.Method.invokeNative(Native Method)
04-14 10:20:40.822: E/AndroidRuntime(17446):    at java.lang.reflect.Method.invoke(Method.java:511)
04-14 10:20:40.822: E/AndroidRuntime(17446):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
04-14 10:20:40.822: E/AndroidRuntime(17446):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
04-14 10:20:40.822: E/AndroidRuntime(17446):    at dalvik.system.NativeStart.main(Native Method)

这是我的片段

@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        rootView = inflater.inflate(R.layout.fragment_photos, container, false);
        googleMap = ((MapFragment) getFragmentManager().findFragmentById(
                R.id.currentmap)).getMap();
        geocoder = new Geocoder(getActivity(), Locale.getDefault());
        // Enabling MyLocation Layer of Google Map
        googleMap.setMyLocationEnabled(true);

        // Getting LocationManager object from System Service LOCATION_SERVICE
        LocationManager locationManager = (LocationManager) getActivity()
                .getSystemService(Context.LOCATION_SERVICE);

        // Creating a criteria object to retrieve provider
        Criteria criteria = new Criteria();

        // Getting the name of the best provider
        String provider = locationManager.getBestProvider(criteria, true);

        // Getting Current Location
        Location location = locationManager.getLastKnownLocation(provider);

        if (location != null) {
            onLocationChanged(location);
        }

        locationManager.requestLocationUpdates(provider, 20000, 0, this);
        return rootView;
    }

    private String getCompleteAddressString(double LATITUDE, double LONGITUDE) {
        String strAdd = "";

        try {
            List<Address> addresses = geocoder.getFromLocation(LATITUDE,
                    LONGITUDE, 1);
            if (addresses != null) {
                Address returnedAddress = addresses.get(0);
                StringBuilder strReturnedAddress = new StringBuilder("");

                for (int i = 0; i < returnedAddress.getMaxAddressLineIndex(); i++) {
                    strReturnedAddress
                            .append(returnedAddress.getAddressLine(i)).append(
                                    "\n");
                }
                strAdd = strReturnedAddress.toString();
                tvLocation.setText(strAdd);
                Log.w("My Current loction address",
                        "" + strReturnedAddress.toString());
            } else {
                Log.w("My Current loction address", "No Address returned!");
            }
        } catch (Exception e) {
            e.printStackTrace();
            Log.w("My Current loction address", "Canont get Address!");
        }
        return strAdd;
    }

    @Override
    public void onLocationChanged(Location location) {

        tvLocation = (TextView) rootView.findViewById(R.id.tv_location);

        // Getting latitude of the current location
        double latitude = location.getLatitude();

        // Getting longitude of the current location
        double longitude = location.getLongitude();

        // Creating a LatLng object for the current location
        LatLng latLng = new LatLng(latitude, longitude);

        // Showing the current location in Google Map
        googleMap.moveCamera(CameraUpdateFactory.newLatLng(latLng));

        // Zoom in the Google Map
        googleMap.animateCamera(CameraUpdateFactory.zoomTo(15));

        // Setting latitude and longitude in the TextView tv_location
        getCompleteAddressString(latitude, longitude);

    }

    @Override
    public void onProviderDisabled(String provider) {
        // TODO Auto-generated method stub
    }

    @Override
    public void onProviderEnabled(String provider) {
        // TODO Auto-generated method stub
    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
        // TODO Auto-generated method stub
    }

/*
    @Override
    public void onDestroyView ()
    {
        try{
          MapFragment fragment = ((MapFragment) getFragmentManager().findFragmentById(R.id.currentmap));
          FragmentTransaction ft = getActivity().getFragmentManager().beginTransaction();
          ft.remove(fragment);
          ft.commit();
        }catch(Exception e){
        }
      super.onDestroyView();
    }*/



    @Override

    public void onDestroyView() {

        super.onDestroyView();
        Log.v("in on destroy", "destroy");

        Fragment fragment = (getFragmentManager()
                .findFragmentById(R.id.currentmap));
        if (fragment != null) {
            getActivity().getFragmentManager().beginTransaction()
                    .remove(fragment).commit();
            Log.v("in on destroy", "destroy");
        }
    }

    @Override
    public void onResume() {
        // TODO Auto-generated method stub
        super.onResume();
        googleMap = ((MapFragment) getFragmentManager().findFragmentById(
                R.id.currentmap)).getMap();
    }
}

解决办法是什么?

【问题讨论】:

  • 你需要为地图销毁片段,在onResume()你需要再次初始化你的谷歌地图。

标签: android google-maps android-fragments navigation-drawer


【解决方案1】:

您需要销毁地图片段,并在onResume() 中再次初始化您的谷歌地图

public void onDestroyView() 
  {
    super.onDestroyView(); 
    Fragment fragment = getFragmentManager().findFragmentById(R.id.map);  
    FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
    ft.remove(fragment);
    ft.commit();
  }

【讨论】:

  • 对于片段没有这样的方法 onDestroyView() 。你想让我把它放在活动中吗?
  • 它是片段的覆盖方法。只需正确检查即可。
  • 好的是的,在简历中我应该再次初始化吗?但我在 oncreateview 中初始化。我应该保持 oncreateview 原样吗?
  • 是的,你应该保留它。
  • 好的。试试看,让我知道。
猜你喜欢
  • 1970-01-01
  • 2016-06-26
  • 1970-01-01
  • 2012-12-17
  • 2020-07-25
  • 2017-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多