Я хочу, чтобы выбрать изображение из галереи и обрезать его, а затем загрузить изображение на сервер. Если вы загружаете успех, измените представление, если загрузка не удалась, они дают сообщение;Ошибка 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
Можете ли вы поделиться больше своей трассировки стека, ведущей к исключению NullPointerException? Было бы полезно, если бы вы могли указать, в какой строке было выбрано исключение. –
@MichaelKrause Обновлено еще несколько кодов трассировки стека –