Как я могу реализовать Android Mapbox Android SDK успешно во фрагменте - PullRequest
0 голосов
/ 08 октября 2018

Я использую mapbox во фрагменте с нижней навигацией, когда я выхожу и возобновляю приложение или когда я быстро меняю вкладки, приложение вылетает.это ошибка, которую я получаю

10-07 22:20:36.046 21867-21886/com.dropexpress.driver.dropexpressdriver E/Mbgl-FileSource: Failed to read the storage key: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.os.Bundle.getBoolean(java.lang.String, boolean)' on a null object reference at com.mapbox.mapboxsdk.storage.FileSource.getCachePath(FileSource.java:88) at com.mapbox.mapboxsdk.storage.FileSource$FileDirsPathsTask.doInBackground(FileSource.java:165) at com.mapbox.mapboxsdk.storage.FileSource$FileDirsPathsTask.doInBackground(FileSource.java:155) at android.os.AsyncTask$2.call(AsyncTask.java:304) at java.util.concurrent.FutureTask.run(FutureTask.java:237) at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607) at java.lang.Thread.run(Thread.java:761) приведенный ниже код всегда дает сбой, когда я выхожу из приложения и возобновляю работу, или когда я быстро меняю вкладки, я использую нижнюю навигацию.

Шаги для воспроизведения

  1. Вот мой фрагмент кода

    package com.dropexpress.driver.dropexpressdriver.fragments;
    import android.content.Context;
    import android.net.Uri;
    import android.os.Bundle;
    import android.support.v4.app.Fragment;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.TextView;
    import com.dropexpress.driver.dropexpressdriver.R;
    import com.mapbox.mapboxsdk.Mapbox;
    import com.mapbox.mapboxsdk.maps.MapView;
        public class HomeFragment extends Fragment {
        private MapView mapView;
        private static final String ARG_PARAM1 = "param1";
        private static final String ARG_PARAM2 = "param2";
    
        private String mParam1;
        private String mParam2;
    
        private OnFragmentInteractionListener mListener;
    
        public HomeFragment() {
            // Required empty public constructor
        }
    
        /**
         * Use this factory method to create a new instance of
         * this fragment using the provided parameters.
         *
         * @param param1 Parameter 1.
         * @param param2 Parameter 2.
         * @return A new instance of fragment HomeFragment.
         */
        // TODO: Rename and change types and number of parameters
        public static HomeFragment newInstance(String param1, String param2) {
            HomeFragment fragment = new HomeFragment();
            Bundle args = new Bundle();
            args.putString(ARG_PARAM1, param1);
            args.putString(ARG_PARAM2, param2);
            fragment.setArguments(args);
            return fragment;
        }
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            if (getArguments() != null) {
                mParam1 = getArguments().getString(ARG_PARAM1);
                mParam2 = getArguments().getString(ARG_PARAM2);
            }
        }
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            // Inflate the layout for this fragment
    
            View view = inflater.inflate(R.layout.fragment_home, container, false);
            Mapbox.getInstance(requireActivity(), "pk.eyJ1Ijoic3ludGF4bHRkIiwiYSI6ImNqaDJxNnhzbDAwNnMyeHF3dGlqODZsYjcifQ.pcz6BWpzCHeZ6hQg4AH9ww");
            mapView = (MapView) view.findViewById(R.id.mapView);
            mapView.onCreate(savedInstanceState);
    
            return  view;
        }
    
        // TODO: Rename method, update argument and hook method into UI event
        public void onButtonPressed(Uri uri) {
            if (mListener != null) {
                mListener.onFragmentInteraction(uri);
            }
        }
    
        @Override
        public void onAttach(Context context) {
            super.onAttach(context);
            if (context instanceof OnFragmentInteractionListener) {
                mListener = (OnFragmentInteractionListener) context;
            } else {
                throw new RuntimeException(context.toString()
                        + " must implement OnFragmentInteractionListener");
            }
        }
    
        @Override
        public void onDetach() {
            super.onDetach();
            mListener = null;
        }
    
        /**
         * This interface must be implemented by activities that contain this
         * fragment to allow an interaction in this fragment to be communicated
         * to the activity and potentially other fragments contained in that
         * activity.
         * <p>
         * See the Android Training lesson <a href=
         * "http://developer.android.com/training/basics/fragments/communicating.html"
         * >Communicating with Other Fragments</a> for more information.
         */
        public interface OnFragmentInteractionListener {
            // TODO: Update argument type and name
            void onFragmentInteraction(Uri uri);
        }
        @Override
        public void onResume() {
            super.onResume();
            mapView.onResume();
        }
    
        @Override
        public void onPause() {
            super.onPause();
            mapView.onPause();
        }
    
        @Override
        public void onStop() {
            super.onStop();
            mapView.onStop();
        }
    
        @Override
        public void onLowMemory() {
            super.onLowMemory();
            mapView.onLowMemory();
        }
    
        @Override
        public void onSaveInstanceState(Bundle outState) {
            super.onSaveInstanceState(outState);
            mapView.onSaveInstanceState(outState);
        }
    
    }
    

Версии Android: 5.0 + Модели устройств: motorola g5 Версии Mapbox SDK: 6.5.0

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

я открыл эту проблему в github, вы проверяете их ответ здесь

https://github.com/mapbox/mapbox-gl-native/issues/13044#issuecomment-427861016

это был их ответ:

Я вижу 2 проблемы с предоставленным кодом:

Вы не звоните MapView#onDestroy, это должно быть вызвано из #onDestroyView вашего фрагмента.MapView#onCreate должен вызываться из фрагмента #onViewCreated вместо #onCreateView.

Я применил изменения, и это сработало!

0 голосов
/ 09 октября 2018

Поместите свой Mapbox.getInstance, прежде чем раздувать макет.

  Mapbox.getInstance(requireActivity(),"Your Map Key");
  View view = inflater.inflate(R.layout.fragment_home, container, false);
  mapView = (MapView) view.findViewById(R.id.mapView);
  mapView.onCreate(savedInstanceState);

Надеюсь, это поможет вам.

...