有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java保存和恢复ArrayList

我的应用程序拍摄两张图片,并将每个URI放入ArrayList中,这样我就可以从单个ImageView中对其进行迭代。我知道URI正在正常工作并被添加到ArrayList中。我假设活动在屏幕上消失,相机旋转(拍摄前面提到的图像),所以我使用onSaveInstanceState保存我想要使用的数据。在我这么做之前,应用程序会在拍照后立即崩溃。现在没有了,但是当我试图从列表中设置image时,我得到了一个空指针。我做错什么了吗

日志:

FATAL EXCEPTION: main
                                                                              Process: my.package.myapplication, PID: 15047
                                                                              java.lang.NullPointerException: Attempt to invoke virtual method 'void 安卓.widget.ImageView.setImageURI(安卓.net.Uri)' on a null object reference
                                                                                  at my.package.myapplication.Person1Screen$5.onClick(Person1Screen.java:130)
                                                                                  at 安卓.view.View.performClick(View.java:5209)
                                                                                  at 安卓.view.View$PerformClick.run(View.java:21174)
                                                                                  at 安卓.os.Handler.handleCallback(Handler.java:739)
                                                                                  at 安卓.os.Handler.dispatchMessage(Handler.java:95)
                                                                                  at 安卓.os.Looper.loop(Looper.java:148)
                                                                                  at 安卓.app.ActivityThread.main(ActivityThread.java:5477)
                                                                                  at java.lang.reflect.Method.invoke(Native Method)
                                                                                  at com.安卓.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                                                  at com.安卓.internal.os.ZygoteInit.main(ZygoteInit.java:616)

我在以下内容底部的setImageURI中获得空指针:

happy = (Button) findViewById(R.id.happy_btn);
happy.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view){
            id = HAPPY;
            if(toggled){
                //picture mode
                dispatchTakePictureIntent();
            }
            else if(!toggled) {
                //display mode
                //happyIndex = 0;
                mainView.setImageURI(happyList.get(0)); // LINE 130
            }
        }
    });

我的onCreate中包含以下内容:

happyList = new ArrayList<>();
    if (savedInstanceState != null) {
        happyList = savedInstanceState.getParcelableArrayList(HAPPY_LIST);
    }

我的实例:

@Override
public void onSaveInstanceState (Bundle savedInstanceState) {
    savedInstanceState.putParcelableArrayList(HAPPY_LIST, happyList);
    super.onSaveInstanceState(savedInstanceState);
}

My TakePictureContent(从照相机或多媒体资料中拍摄两张照片)和onActivityResult(拍摄URI并添加到列表中):

private void dispatchTakePictureIntent() {
    pictureCounter = -1;
    for(int i = 0; i < 2; i++) {
        pictureCounter++;
        Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
            // Create the File where the photo should go
            File photoFile = null;
            try {
                photoFile = createImageFile();
                outputFileUri = Uri.fromFile(photoFile);
            } catch (IOException ex) {
                Log.w("error","IOException");
            }catch (NullPointerException nullEx) {
                Log.w("error","NullPointerException");
            }
            // Camera.
            final List<Intent> cameraIntents = new ArrayList<Intent>();
            final Intent captureIntent = new Intent(安卓.provider.MediaStore.ACTION_IMAGE_CAPTURE);
            final PackageManager packageManager = getPackageManager();
            final List<ResolveInfo> listCam = packageManager.queryIntentActivities(captureIntent, 0);
            for (ResolveInfo res : listCam) {
                final String packageName = res.activityInfo.packageName;
                final Intent intent = new Intent(captureIntent);
                intent.setComponent(new ComponentName(res.activityInfo.packageName, res.activityInfo.name));
                intent.setPackage(packageName);
                intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(photoFile));
                cameraIntents.add(intent);
            }
            // Filesystem.
            final Intent galleryIntent = new Intent();
            galleryIntent.setType("image/*");
            galleryIntent.setAction(Intent.ACTION_GET_CONTENT);
            // Chooser of filesystem options.
            final Intent chooserIntent = Intent.createChooser(galleryIntent, "Select Source");
            // Add the camera options.
            chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, cameraIntents.toArray(new Parcelable[cameraIntents.size()]));
            startActivityForResult(chooserIntent, REQUEST_TAKE_PHOTO);
        }
    }
}

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == RESULT_OK) {
            if (requestCode == REQUEST_TAKE_PHOTO) {
                final boolean isCamera;
                if (data == null) {
                    isCamera = true;
                } else {
                    final String action = data.getAction();
                    if (action == null) {
                        isCamera = false;
                    } else {
                        isCamera = action.equals(安卓.provider.MediaStore.ACTION_IMAGE_CAPTURE);
                    }
                }
                Uri selectedImageUri;
                if (isCamera) {
                    selectedImageUri = outputFileUri;
                } else {
                    selectedImageUri = data == null ? null : data.getData();
                }
               // mainView.setImageURI(selectedImageUri);
              //  Log.d("Before adding", selectedImageUri.toString());
                happyList.add(selectedImageUri);
               // Log.d("Array:", happyList.toString());
            }
        }
    }

共 (2) 个答案

  1. # 1 楼答案

    在onSavedInstanceState()方法中,将键设置为“happylist”,将if条件中的“array”更改为“happylist”

    if (savedInstanceState != null) {
        happyList = (ArrayList<Uri>)savedInstanceState.getSerializable("happylist");
    }
    
  2. # 2 楼答案

    首先,建议您在类中存储一个键常量。主要原因是为了保持一致,避免拼写错误

    public static final String HAPPY_LIST = "happyList";
    

    现在,在保存和恢复时使用它

    其次,我认为这些应该被翻转,因为你想把你保存的东西放进去,然后做超级调用所做的任何事情

    此外,Uri对象是可打包的,因此请使用适当的方法

    @Override
    public void onSaveInstanceState (Bundle savedInstanceState) {
        savedInstanceState.putParcelableArrayList(HAPPY_LIST, happyList);
        super.onSaveInstanceState(savedInstanceState);
    }
    

    最后,您可以在onRestoreInstanceState或onCreate中使用已恢复的捆绑包,但我认为您不需要同时使用这两种方式