好吧,我这里有一个奇怪的问题,如果有人能回答的话。
我有一个应用程序,启动默认相机拍摄照片,并将其上传到服务器。上传过程发生在扩展AsyncTask的内部类中。在调用异步任务之前,我有一个方法,它显示一个进度对话框,然后在AsyncTask的onPost Execute方法中将其清除。这一切在我自己的设备上都工作得很好。当我在三星Galaxy S3上测试它时,问题出现了。
我在progressDialog.Show()上得到一个空指针异常;它不会使应用程序崩溃,只是不显示对话框。但是当我试图关闭对话框onPostExecute时,我确实遇到了崩溃。我认为这是因为S3的摄像头似乎只在横向打开(尽管我的整个应用程序都被锁定为肖像,谷歌告诉我一切都是可能的),方向的改变导致活动的刷新,导致对progressDialog的引用丢失。
无论如何更改对话框的实例化位置(onPreExecute()不起作用,但我仍然得到相同的问题),检查它是否为空或保存实例状态已经解决了这个问题。我在另一篇文章中读到,有些人在保存到SD卡时遇到了问题。S3没有SD卡,但该应用程序正在尝试写入外部存储。我试着检查是否有SD卡使用。
Boolean isSDPresent = android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED);即使没有SD卡,它实际上也返回true。将图像写入外部存储并不重要,因此我尝试使用此命令获取缓存副本。
File image = File.createTempFile(
imageFileName,
JPEG_FILE_SUFFIX,
this.getCacheDir()
);这也没有什么不同。为什么你会问我是否关心这个SD卡问题它不可能影响进度对话框。如果我把SD卡放入S3,这个问题就会消失,进度对话框就会完美地出现。我不知道为什么会这样,但我不能保证使用这个应用程序的人会在他们的设备上有SD卡,所以我需要找到一个合适的修复方法。
很抱歉写了这篇文章,但我认为需要解释一下才能清楚地理解它。任何想法或解决方案都将不胜感激。
下面的代码是我正在使用的内容的精简版本,我试图只包含相关的材料。
@Override public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.compare_layout_activity);
findViewById(R.id.bCompare).setOnClickListener(new OnClickListener() {
public void onClick(View v) {
try{
capturedImage = createImageFile();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(isNetworkAvailable()){
Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
i.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(capturedImage));
startActivityForResult(i, REQ_CODE_PHOTO_TAKE);
}
else{
displayAlert("Network Error", "You do not have access to the internet. Please turn on your WiFi.");
}
}
});
}
protected File createImageFile() throws IOException {
// Create an image file name
String timeStamp =
new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
String imageFileName = JPEG_FILE_PREFIX + timeStamp + "_";
File image = File.createTempFile(
imageFileName,
JPEG_FILE_SUFFIX,
this.getCacheDir()
);
capturedImagePath = image.getAbsolutePath();
return image;
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == Activity.RESULT_OK) {
showProgressDialog();
new LongOperation(getApplicationContext()).execute("");
} else if (resultCode == Activity.RESULT_CANCELED) {
}
}
private void showProgressDialog(){
progressDialog = new ProgressDialog(this);
progressDialog.setMessage("Checking progress");
progressDialog.setCanceledOnTouchOutside(false);
progressDialog.show();
}
//I wont include the full async task because the code executes fine except for the crash on the show progress Dialog so i'll include the onPostExecute
@Override
protected void onPostExecute(String result) {
if (progressDialog != null) {
progressDialog.dismiss();
}几乎忘记了包括堆栈跟踪,尽管它不是最有用的信息。这发生在progressDialog.show()上;
02-27 18:11:33.945: E/WindowManager(21994): Activity com.activity.CompareActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@41ed6318 that was originally added here
02-27 18:11:33.945: E/WindowManager(21994): android.view.WindowLeaked: Activity com.activity.CompareActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@41ed6318 that was originally added here
02-27 18:11:33.945: E/WindowManager(21994): at android.view.ViewRootImpl.<init>(ViewRootImpl.java:402)
02-27 18:11:33.945: E/WindowManager(21994): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:311)
02-27 18:11:33.945: E/WindowManager(21994): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:224)
02-27 18:11:33.945: E/WindowManager(21994): at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:149)
02-27 18:11:33.945: E/WindowManager(21994): at android.view.Window$LocalWindowManager.addView(Window.java:558)
02-27 18:11:33.945: E/WindowManager(21994): at android.app.Dialog.show(Dialog.java:277)
02-27 18:11:33.945: E/WindowManager(21994): at com.activity.CompareActivity.showProgressDialog(CompareActivity.java:324)
02-27 18:11:33.945: E/WindowManager(21994): at com.activity.CompareActivity.onActivityResult(CompareActivity.java:249)
02-27 18:11:33.945: E/WindowManager(21994): at android.app.Activity.dispatchActivityResult(Activity.java:5368)
02-27 18:11:33.945: E/WindowManager(21994): at android.app.ActivityThread.deliverResults(ActivityThread.java:3178)
02-27 18:11:33.945: E/WindowManager(21994): at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2603)
02-27 18:11:33.945: E/WindowManager(21994): at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2644)
02-27 18:11:33.945: E/WindowManager(21994): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2130)
02-27 18:11:33.945: E/WindowManager(21994): at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3553)
02-27 18:11:33.945: E/WindowManager(21994): at android.app.ActivityThread.access$700(ActivityThread.java:140)
02-27 18:11:33.945: E/WindowManager(21994): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1233)
02-27 18:11:33.945: E/WindowManager(21994): at android.os.Handler.dispatchMessage(Handler.java:99)
02-27 18:11:33.945: E/WindowManager(21994): at android.os.Looper.loop(Looper.java:137)
02-27 18:11:33.945: E/WindowManager(21994): at android.app.ActivityThread.main(ActivityThread.java:4898)
02-27 18:11:33.945: E/WindowManager(21994): at java.lang.reflect.Method.invokeNative(Native Method)
02-27 18:11:33.945: E/WindowManager(21994): at java.lang.reflect.Method.invoke(Method.java:511)
02-27 18:11:33.945: E/WindowManager(21994): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006)
02-27 18:11:33.945: E/WindowManager(21994): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773)
02-27 18:11:33.945: E/WindowManager(21994): at dalvik.system.NativeStart.main(Native Method)发布于 2013-03-04 23:58:35
另一种模式如何,例如:
如果问题以某种方式与相机活动之前和之后的活动相关,这可能会通过创建一个全新的活动(从头开始)来处理上传,从而潜在地解决问题。你认为如何?
https://stackoverflow.com/questions/15119388
复制相似问题