【问题标题】:Attempt to invoke virtual method RecyclerView$LayoutManager.onRestoreInstanceState(android.os.Parcelable)' on a null object reference [duplicate]尝试在空对象引用上调用虚拟方法 RecyclerView$LayoutManager.onRestoreInstanceState(android.os.Parcelable)' [重复]
【发布时间】:2017-07-06 00:00:07
【问题描述】:
 I am getting error when i rotate screen 

java.lang.RuntimeException:无法恢复活动 {com.example.naveen.bakingapp/com.example.naveen.bakingapp.MainActivity}:java.lang.NullPointerException:尝试调用虚拟方法 'void android.support。 v7.widget.RecyclerView$LayoutManager.onRestoreInstanceState(android.os.Parcelable)' 在空对象引用上 在 android.app.ActivityThread.performResumeActivity(ActivityThread.java:3121) 在 android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3152) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2495) 在 android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:4098) 在 android.app.ActivityThread.-wrap15(ActivityThread.java) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1360) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:148) 在 android.app.ActivityThread.main(ActivityThread.java:5443) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 原因:java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“void android.support.v7.widget.RecyclerView$LayoutManager.onRestoreInstanceState(android.os.Parcelable)”

public class MainActivity extends AppCompatActivity {
   // @BindView(R.id.recyclerview) RecyclerView recyclerView;
    ArrayList<Receipe>receipeArrayList;
    RecyclerView recyclerView;`enter code here`
    Parcelable mListInstanceState;`enter code here`
    LinearLayoutManager layoutManager;
    private static Bundle mBundleRecyclerViewState;
    private final String KEY_RECYCLER_STATE = "recycler_state";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
       // ButterKnife.bind(this);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        receipeArrayList=new ArrayList<>();
        recyclerView=(RecyclerView)findViewById(R.id.recyclerview);

new GetAllReceipe().execute();
    }
    public class GetAllReceipe extends AsyncTask<String,Integer,String>
    {   String response;
        ProgressDialog dialog;
        ContentValues receipeValuesArr;
        int progressStatus = 0;
        boolean running;
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            running = true;
            dialog = new ProgressDialog(MainActivity.this);
            dialog.setMessage("Loading, please wait");
            dialog.setTitle("Connecting server");
            dialog.show();
            dialog.setCancelable(false);
            dialog.setProgress(progressStatus);
            dialog.setOnCancelListener(new DialogInterface.OnCancelListener() {
                @Override
                public void onCancel(DialogInterface dialog) {
                    running = false;
                }
            });
        }
        @Override
        protected String doInBackground(String... params) {
            URL url ;
            HttpURLConnection connection ;
            try {
                url = new URL("https://d17h27t6h515a5.cloudfront.net/topher/2017/May/59121517_baking/baking.json");
                connection = (HttpURLConnection) url.openConnection();
                BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream()));
                StringBuilder buffer = new StringBuilder();
                String temp;
                while ((temp=br.readLine())!=null)
                {
                    buffer.append(temp);
                }
                response=buffer.toString();

                int i = 5;
                while (running & progressStatus < 5) {
                    try {
                        progressStatus++;
                        publishProgress(progressStatus);
                        Thread.sleep(300);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                    if (i-- == 0) {
                        running = false;
                    }
                    publishProgress(i);

                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            return response;
        }
        @Override
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);
            dialog.setProgress(progressStatus);
        }
        @Override
        protected void onPostExecute(String response) {
            //Log.i("result",response.toString());
            if (dialog!=null&&dialog.isShowing()){dialog.dismiss();}
            try {
               // JSONObject jsonObject=new JSONObject(response);
                JSONArray jsonArray=new JSONArray(response);
                for (int i=0;i<jsonArray.length();i++)
                {
                    JSONObject object=jsonArray.getJSONObject(i);
                    receipeValuesArr = new ContentValues();
                    Receipe receipe=new Receipe();
                    receipe.setReceipe_name(object.getString("name"));
                    receipe.setId(object.getInt("id"));
                    receipeArrayList.add(receipe);
                    receipeValuesArr.put(ReceipeContract.ReceipeEntry.COLUMN_RECEIPE_ID,object.getInt("id"));
                    receipeValuesArr.put(ReceipeContract.ReceipeEntry.COLUMN_RECEIPE_NAME, object.getString("name"));
                    getContentResolver().insert(ReceipeContract.ReceipeEntry.CONTENT_URI,receipeValuesArr);
                }
               //final RecyclerView.LayoutManager lmanager=new LinearLayoutManager(MainActivity.this,LinearLayoutManager.VERTICAL,true);
                layoutManager = new LinearLayoutManager(MainActivity.this);

                layoutManager.setOrientation(LinearLayoutManager.VERTICAL);

                recyclerView.setLayoutManager(layoutManager);
                recyclerView.setAdapter(new ReceipeAdapter(receipeArrayList,MainActivity.this));
                recyclerView.setItemAnimator(new DefaultItemAnimator());

            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);

        outState.putParcelable("list_state",layoutManager.onSaveInstanceState());

    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);

if (savedInstanceState!=null)
{
    mListInstanceState = savedInstanceState.getParcelable("list_state");

}

   /*
        assert mListInstanceState != null;
        //System.out.println(recyclerView.getLayoutManager().toString());
        if (recyclerView.getLayoutManager()!=null){
            recyclerView.getLayoutManager().onRestoreInstanceState(mListInstanceState);

        }
            else {
            System.out.println("layoutmanager is  null");
        }*/
    }
   /* @Override
    protected void onResume() {
        super.onResume();

        if (mListInstanceState != null) {
            layoutManager.onRestoreInstanceState(mListInstanceState);
        }
    }*/


    @Override
    protected void onPause()
    {
        super.onPause();

        // save RecyclerView state
        mBundleRecyclerViewState = new Bundle();
        Parcelable listState = recyclerView.getLayoutManager().onSaveInstanceState();
        mBundleRecyclerViewState.putParcelable(KEY_RECYCLER_STATE, listState);
    }

    @Override
    protected void onResume()
    {
        super.onResume();

        // restore RecyclerView state
        if (mBundleRecyclerViewState != null) {
            Parcelable listState = mBundleRecyclerViewState.getParcelable(KEY_RECYCLER_STATE);
            recyclerView.getLayoutManager().onRestoreInstanceState(listState);
        }
    }
}

【问题讨论】:

    标签: java android nullpointerexception


    【解决方案1】:

    它正在发生,因为在旋转后您的视图为空,并且您尝试在此可空视图上调用方法。

    1) 安全代码。(不推荐,因为你只修复崩溃,而不是问题)

    尝试改变这个:

    if (mBundleRecyclerViewState != null) {
                Parcelable listState = mBundleRecyclerViewState.getParcelable(KEY_RECYCLER_STATE);
                recyclerView.getLayoutManager().onRestoreInstanceState(listState);
            }
    

    对此(安全代码):

        if (mBundleRecyclerViewState != null && recyclerView != null) {
            Parcelable listState = mBundleRecyclerViewState.getParcelable(KEY_RECYCLER_STATE);
            if (recyclerView.getLayoutManager() != null) {
                recyclerView.getLayoutManager().onRestoreInstanceState(listState);
            }
        }
    

    2) 旋转后保存和恢复变量 Android: Save variables and settings on rotation

    或者在这种情况下,您可以在活动中添加此代码:

    @Override
      protected void onResume() {
        super.onResume();
        recyclerView=(RecyclerView)findViewById(R.id.recyclerview);
      }
    

    【讨论】:

    • 错误已修复,但在更改屏幕方向时,recyclerview 状态未保留
    • 使用onRestoreInstanceStateonSaveInstanceState方法保存和恢复recyclerview状态:stackoverflow.com/questions/32121761/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多