NullPointerException在onActivityResult中使用AsyncTask时出错

时间:2015-05-13 23:38:22

标签: android android-asynctask onactivityresult

我想从图库中选择图像并裁剪它,然后将图像上传到服务器。如果上传成功,则更改视图,如果上传失败,则会发送消息;

我使用onActivityResult来管理它,我使用AsyncTask来发布http post,关闭progressDialog,然后保存Image,然后我跑到了这个错误

java.lang.RuntimeException: Failure delivering result ResultInfo...

引起
Caused by: java.lang.NullPointerException

在我的AsyncTask代码中;

这是我的裁剪按钮

avatarButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(Intent.ACTION_PICK);
            intent.setType("image/*");
            startActivityForResult(intent,1);
        }
    });

和onActivityResult代码

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

    switch (requestCode){
        case 1:              
            if (data != null) {    
                Uri uri = data.getData();
                crop(uri);
            }
        case 2:
             if (data != null) {
                    final Bitmap bitmap = data.getParcelableExtra("data");
                    new UploadAvatar(UserProfileActivity.this, bitmap).execute();
                }   
    }
    super.onActivityResult(requestCode, resultCode, data);
}

裁剪方法

private void crop(Uri uri) {
    Intent intent = new Intent("com.android.camera.action.CROP");
    intent.setDataAndType(uri, "image/*");
    intent.putExtra("crop", "true");

    intent.putExtra("aspectX", 1);
    intent.putExtra("aspectY", 1);

    intent.putExtra("outputX", 100);
    intent.putExtra("outputY", 100);

    intent.putExtra("outputFormat", "PNG");
    intent.putExtra("noFaceDetection", true);
    intent.putExtra("return-data", true);

    startActivityForResult(intent, 2);
}

和AsyncTask类

class UploadAvatar extends AsyncTask<Void,Integer,Boolean> {
private Context context;
private String avatarString;
private ProgressDialog progressDialog;
private ImageView avatarImage;
private Bitmap avatar;

public UploadAvatar(Context contextin,Bitmap bitmap){

    this.context = contextin;
    this.avatar = bitmap;
    View rootView = ((Activity)contextin).getWindow().getDecorView().findViewById(android.R.id.content);
    this.avatarImage = (ImageView)rootView.findViewById(R.id.setavatar);
}

@Override
protected void onPreExecute(){
    progressDialog = new ProgressDialog(context);
    progressDialog.setMessage("正在上传头像");
    progressDialog.setCancelable(true);
    progressDialog.show();
    ByteArrayOutputStream baos=new  ByteArrayOutputStream();
    if(avatar == null){
        Log.d("222","Null");
    }
    //Here i Got error,that avatar is null;
    avatar.compress(Bitmap.CompressFormat.PNG,90,baos);
    byte[] b=baos.toByteArray();
    avatarString= new String(b);
}

@Override
protected Boolean doInBackground(Void... param){
    //try upload Image to server
}

@Override
protected void onPostExecute(Boolean result){
    ...//do some work
}

}

这让我很困惑,因为当我点击图库中的图片时我得到了这个错误,试图调用Crop(),我没有完成我的裁剪,所以Bitmap数据显然是空的,似乎之前执行AsyncTask我完成了我的裁剪。这很令人困惑,在crop()方法中,我开始打算像这样裁剪:startActivityForResult(intent, 2);

但onActivityResult在交付结果之前执行了代码。

请帮助,提前谢谢。这真让我抓狂。 :(

更新: 这里有一些NullPointerObject堆栈跟踪代码:

at com.example.allen.bubbles001.Activity.UploadAvatar.onPreExecute(UserProfileActivity.java:229)
at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:587)
at android.os.AsyncTask.execute(AsyncTask.java:535)
at com.example.allen.bubbles001.Activity.UserProfileActivity.onActivityResult(UserProfileActivity.java:168)
at android.app.Activity.dispatchActivityResult(Activity.java:5423)
at android.app.ActivityThread.deliverResults(ActivityThread.java:3347)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:3394)

的第一个入口点
avatar.compress(Bitmap.CompressFormat.PNG,90,baos);
在UploadAvatar.onPreExcute

的第四个切入点
new UploadAvatar(UserProfileActivity.this, bitmap).execute();
onActivityResult

1 个答案:

答案 0 :(得分:1)

可能是位图为null。你似乎把它从数据中删除了#34;意图,这可能不是一个好主意。意图具有额外的最大大小限制,如果位图很大,您将轻松超过限制。相反,我建议将其保存到磁盘并将文件名作为额外内容放入Intent中,以便您可以从文件中读取它。