【问题标题】:After calling startActivityForResult() subsequent code still runs调用 startActivityForResult() 后,后续代码仍然运行
【发布时间】:2016-07-13 05:36:35
【问题描述】:

所以基本上我希望应用程序:按下按钮打开图库后,用户选择一张图像,然后将 uri 保存在变量中。这就是它需要做的所有事情,但我发现在调用 startActivityForResult() 后,后续代码仍然在后台运行,创建 NullPointerException 错误,因为我想要的变量尚未从意图中检索到。

public class MainActivity extends AppCompatActivity {

    final static int PICK_IMAGE_REQUEST = 1;

    private String imageUriStr;

    SharedPreferences prefs;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        prefs = this.getSharedPreferences("MyPreferences",MODE_PRIVATE);

        ImageView addImgButton = (ImageView) findViewById(R.id.add_img_button);

        addImgButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                Intent intent = new Intent();
                intent.setType("image/*");
                intent.setAction(Intent.ACTION_GET_CONTENT);
                startActivityForResult(Intent.createChooser(intent, "Select Picture"), PICK_IMAGE_REQUEST);

                if (prefs.contains(imageUriStr)) {
                    imageUriStr = prefs.getString("imageUriStr", ""); //Get the data from prefs
                }

                Log.d("Value",imageUriStr); //verify if it is correct

                prefs.edit().clear();
            }
        });
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK && data != null && data.getData() != null) {

            imageUriStr = data.getData().toString(); //convert to string to use it with SharedPreferences

            prefs.edit().putString("imageUriStr",imageUriStr).apply();

        }

    }
}

一种解决方案是在 onActivityresult 中完成所有操作,但我还想稍后使用另一个意图来根据该 uri 裁剪图像,但我认为 onActivityresult 中的 Intent 会太混乱还是可以接受?我想我错过了什么。

保持我的代码会生成这个

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.android.prototypeapp, PID: 17826
java.lang.NullPointerException: println needs a message
    at android.util.Log.println_native(Native Method)
    at android.util.Log.d(Log.java:154)
    at com.example.android.prototypeapp.MainActivity$1$override.onClick(MainActivity.java:41)
    at com.example.android.prototypeapp.MainActivity$1$override.access$dispatch(MainActivity.java)
    at com.example.android.prototypeapp.MainActivity$1.onClick(MainActivity.java:0)
    at android.view.View.performClick(View.java:5264)
    at android.view.View$PerformClick.run(View.java:21297)
    at android.os.Handler.handleCallback(Handler.java:743)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:150)
    at android.app.ActivityThread.main(ActivityThread.java:5546)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:794)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:684)

【问题讨论】:

  • 您在Log.d("Value",imageUriStr); 中的imageUriStr 为空
  • if (prefs.contains(imageUriStr)) 更改为 if (prefs.contains("imageUriStr")) 并在 if 中添加 Log.d
  • 感谢工作!所以它是这样工作的?:调用 startActivityForResult 后,后续代码仍将在后台运行,返回后,它将从 startActivityForResult 之后的行中提取?
  • 调用 startActivity(...)startActivityForResult(...) 不会立即启动活动。可以把它想象成要求 Android 框架在未来的某个时间启动活动。

标签: java android android-intent activity-lifecycle


【解决方案1】:

你的private String imageUriStr; 是空的。因为它是空的,你得到空指针异常。用空字符串分配它,例如:private String imageUriStr = "";

签入共享偏好,例如: if(prefs.contains("imageUriStr"))

【讨论】:

    【解决方案2】:

    您的代码在此行崩溃:

     Log.d("Value",imageUriStr); 
    

    原因:imageUriStr 值为 null,需要有效消息才能打印日志

    您可以使用 Log as :

     Log.d("Value","Image URI Value: "+imageUriStr); 
    

    或者你可以把你的日志放在 if 块里面:

          if (prefs.contains(imageUriStr)) {
                            imageUriStr = prefs.getString("imageUriStr", "");//Get the data from prefs
              Log.d("Value",imageUriStr); //verify if it is correct
                                           }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-09
      • 1970-01-01
      • 1970-01-01
      • 2020-11-25
      • 1970-01-01
      • 1970-01-01
      • 2012-10-25
      相关资源
      最近更新 更多