2015-05-13 1 views
0

Я хочу, чтобы выбрать изображение из галереи и обрезать его, а затем загрузить изображение на сервер. Если вы загружаете успех, измените представление, если загрузка не удалась, они дают сообщение;Ошибка NullPointerException при использовании AsyncTask в onActivityResult

I Использование onActivityResult управлять этим, и я использую AsyncTask сделать HTTP Post, уволить progressDialog и сохранить изображение, тогда я побежал к этой ошибке

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); 
} 

метод Crop

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 очевидно Null, кажется, выполняется AsyncTask до того, как я закончу свой урожай. Это довольно запутанно, в методе crop() я начинаю убирать вот так: startActivityForResult(intent, 2);

Но onActivityResult выполнил коды до того, как Результат вернется.

Пожалуйста, помогите, спасибо заранее. Это действительно привлекает меня с ума. :(

Update: Вот некоторые более 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(); 

in onActivityResult

+0

Можете ли вы поделиться больше своей трассировки стека, ведущей к исключению NullPointerException? Было бы полезно, если бы вы могли указать, в какой строке было выбрано исключение. –

+0

@MichaelKrause Обновлено еще несколько кодов трассировки стека –

ответ

1

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

+1

Это не решение. Вопрос: onActivityResult excute код AsyncTask сначала, прежде чем Crop сможет создать любое изображение.Конечно, это Null, но спасибо за консультацию –

+0

@Jschools верен. В вашем случае проблема в случае 2 вашего 'onActivityResult()'. Растровое изображение, которое вы получаете из 'data.getParcelableExtras()', равно null. Попробуйте использовать '(Bitmap) data.getExtras(). Get (" data ");' и попробуйте проверить содержимое вашего Intent перед тем, как начать свою асинтезу – Android2390

+0

Справа: вы не можете предположить, что устройство даже поддерживает намерение CROP: https: //commonsware.com/blog/2013/01/23/no-android-does-not-have-crop-intent.html – Jschools