Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/189.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 运行多个AsyncTask将退出应用程序,而不显示任何特定错误_Android_Android Asynctask_Android Camera_Jakarta Mail - Fatal编程技术网

Android 运行多个AsyncTask将退出应用程序,而不显示任何特定错误

Android 运行多个AsyncTask将退出应用程序,而不显示任何特定错误,android,android-asynctask,android-camera,jakarta-mail,Android,Android Asynctask,Android Camera,Jakarta Mail,在我的应用程序中,我有一个非常简单的任务要做 1.当按下硬件音量按钮时,使用自定义相机类拍摄图像。一旦开始拍摄,它应以固定间隔(比如2秒)自动拍摄图像 2.每个图像必须保存在SD卡中,并在后台发送到相应的邮件Id 为了实现上述目标,我创建了一个自定义的摄像头类和覆盖硬件卷按钮来捕获图片。为了在后台发送邮件,我使用了Java mail API 由于我必须每隔2秒发送一次邮件,因此我使用AsyncTask将邮件发送并保存到SD卡代码中。我还从其他一些帖子中发现,AsyncTask的池大小最大为128

在我的应用程序中,我有一个非常简单的任务要做

1.当按下
硬件
音量
按钮时,使用自定义
相机
类拍摄图像。一旦开始拍摄,它应以固定间隔(比如2秒)自动拍摄图像

2.每个图像必须保存在SD卡中,并在后台发送到相应的邮件Id

为了实现上述目标,我创建了一个自定义的
摄像头类
覆盖
硬件
按钮来捕获图片。为了在后台发送邮件,我使用了Java mail API

由于我必须每隔2秒发送一次邮件,因此我使用
AsyncTask
将邮件发送并保存到SD卡代码中。我还从其他一些帖子中发现,
AsyncTask
的池大小最大为128+10=138。由于我以2秒的间隔发送邮件,它超过了导致错误的最大池大小

但我的要求是以2秒的间隔捕获高分辨率图像并将其邮寄到相应的邮件Id

是否可以使用
AsyncTask
?或者android提供的任何其他框架来执行长时间运行的任务

以下是我到目前为止所做的尝试

硬件音量键覆盖

 public boolean onKeyDown(int keyCode, KeyEvent event) 
        { 
           if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN || keyCode == KeyEvent.KEYCODE_VOLUME_UP) { 

                timer = new Timer();
                TimerTask updateProfile = new CustomTimerTask(DVCameraActivity.this);
                timer.scheduleAtFixedRate(updateProfile, 0, 2000);
                Toast toast= Toast.makeText(getApplicationContext(), "Picture Capturing Started..", Toast.LENGTH_LONG);
                toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0);
                toast.show();
           return true;
       } else {
           return super.onKeyDown(keyCode, event); 
       }
    }
CustomTimerTask

public class CustomTimerTask extends TimerTask {
        public CustomTimerTask(Context con) {
        }
        @Override
        public void run() {
             if (isCamera == true)
                mCamera.takePicture(null, null, mPicture);
        }

    }
class SavePhotoTask extends AsyncTask<byte[], String, String> {
        @SuppressLint("SimpleDateFormat")
        @Override
        protected String doInBackground(byte[]... jpeg) {


            File mediaStorageDir = new File(
                    Environment
                            .getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES),
                    "Secret Camera");

            if (!mediaStorageDir.exists()) {
                if (!mediaStorageDir.mkdirs()) {
                    Log.d("MyCameraApp", "failed to create directory");
                    return null;
                }
            }

            String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss")
                    .format(new Date());
            File mediaFile;
            mediaFile = new File(mediaStorageDir.getPath() + File.separator
                    + "IMG_" + timeStamp + "." + mSuffix);
            try {
                FileOutputStream fos = new FileOutputStream(mediaFile);
                fos.write(jpeg[0]);
                fos.close();

                path=mediaFile.getAbsolutePath();
                SendMail(path);
            } catch (FileNotFoundException e) {

            } catch (IOException e) {
            }

            return mediaFile.toString();
        }

        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);


        }


    }
PictureCallback

PictureCallback mPicture = new PictureCallback() {
        @Override
        public void onPictureTaken(byte[] data, Camera camera) {
            new SavePhotoTask().execute(data);
             if (mCamera!= null)
            camera.startPreview();
        }

    };
SavePhotoTask()

class SavePhotoTask扩展了AsyncTask{
@SuppressLint(“SimpleDataFormat”)
@凌驾
受保护的字符串doInBackground(字节[]…jpeg){
File mediaStorageDir=新文件(
环境
.getExternalStoragePublicDirectory(Environment.DIRECTORY\u图片),
“秘密照相机”);
如果(!mediaStorageDir.exists()){
如果(!mediaStorageDir.mkdirs()){
Log.d(“MyCameraApp”,“创建目录失败”);
返回null;
}
}
字符串时间戳=新的SimpleDataFormat(“yyyyMMdd_HHmmss”)
.格式(新日期());
文件媒体文件;
mediaFile=新文件(mediaStorageDir.getPath()+File.separator
+“IMG_”+时间戳+”+mSuffix);
试一试{
FileOutputStream fos=新的FileOutputStream(mediaFile);
fos.write(jpeg[0]);
fos.close();
path=mediaFile.getAbsolutePath();
SendMail(路径);
}catch(filenotfounde异常){
}捕获(IOE异常){
}
返回mediaFile.toString();
}
@凌驾
受保护的void onPostExecute(字符串结果){
super.onPostExecute(结果);
}
}
SendMail()

private void SendMail(字符串Imagepath){
邮件m=新邮件(Constants.email,Constants.psw);
字符串[]toArr={Constants.email};
m、 设置为(toArr);
m、 从(“”)开始设置;
m、 设置主题(“间谍相机图像”);
m、 setBody(“如果你正在观看图像,那么我的间谍相机应用程序正在运行..瞧!!”;
试一试{
m、 添加附件(Imagepath);
if(m.send()){
Log.i(“邮件发送”、“成功”);
发送=真;
}否则{
发送=假;
Log.i(“邮件发送”,“失败”);
}
}捕获(例外e){
Log.e(“MailApp”,“无法发送电子邮件”,e);
}
}
Logcat错误

08-23 18:37:55.609: I/dalvikvm(12540): DALVIK THREADS:
08-23 18:37:55.609: I/dalvikvm(12540): "main" prio=5 tid=1 WAIT
08-23 18:37:55.609: I/dalvikvm(12540):   | group="main" sCount=1 dsCount=0 s=N obj=0x401b8968 self=0xcd38
08-23 18:37:55.609: I/dalvikvm(12540):   | sysTid=12540 nice=0 sched=0/0 cgrp=default handle=-1345017816
08-23 18:37:55.609: I/dalvikvm(12540):   at java.lang.Object.wait(Native Method)
08-23 18:37:55.609: I/dalvikvm(12540):   - waiting on <0x48718010> (a android.os.MessageQueue)
08-23 18:37:55.609: I/dalvikvm(12540):   at java.lang.Object.wait(Object.java:288)
08-23 18:37:55.617: I/dalvikvm(12540):   at android.os.MessageQueue.next(MessageQueue.java:146)
08-23 18:37:55.617: I/dalvikvm(12540):   at android.os.Looper.loop(Looper.java:110)
08-23 18:37:55.624: I/dalvikvm(12540):   at android.app.ActivityThread.main(ActivityThread.java:4632)
08-23 18:37:55.624: I/dalvikvm(12540):   at java.lang.reflect.Method.invokeNative(Native Method)
08-23 18:37:55.624: I/dalvikvm(12540):   at java.lang.reflect.Method.invoke(Method.java:521)
08-23 18:37:55.624: I/dalvikvm(12540):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:871)
08-23 18:37:55.624: I/dalvikvm(12540):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:629)
08-23 18:37:55.624: I/dalvikvm(12540):   at dalvik.system.NativeStart.main(Native Method)
08-23 18:37:55.624: I/dalvikvm(12540): "AsyncTask #34" prio=5 tid=42 MONITOR
08-23 18:37:55.609:I/dalvikvm(12540):DALVIK线程:
08-23 18:37:55.609:I/dalvikvm(12540):“主”优先级=5 tid=1等待
2008-23 18:37:55.609:I/dalvikvm(12540):| group=“main”scont=1 dsCount=0 s=N obj=0x401b8968 self=0xcd38
08-23 18:37:55.609:I/dalvikvm(12540):| sysTid=12540 nice=0 sched=0/0 cgrp=default handle=-1345017816
08-23 18:37:55.609:I/dalvikvm(12540):位于java.lang.Object.wait(本机方法)
08-23 18:37:55.609:I/dalvikvm(12540):-等待(一个android.os.MessageQueue)
08-23 18:37:55.609:I/dalvikvm(12540):位于java.lang.Object.wait(Object.java:288)
08-23 18:37:55.617:I/dalvikvm(12540):在android.os.MessageQueue.next(MessageQueue.java:146)
08-23 18:37:55.617:I/dalvikvm(12540):位于android.os.Looper.loop(Looper.java:110)
08-23 18:37:55.624:I/dalvikvm(12540):位于android.app.ActivityThread.main(ActivityThread.java:4632)
08-23 18:37:55.624:I/dalvikvm(12540):位于java.lang.reflect.Method.Invokenactive(本机方法)
08-23 18:37:55.624:I/dalvikvm(12540):位于java.lang.reflect.Method.invoke(Method.java:521)
08-23 18:37:55.624:I/dalvikvm(12540):位于com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:871)
08-23 18:37:55.624:I/dalvikvm(12540):位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:629)
2008-23 18:37:55.624:I/dalvikvm(12540):在dalvik.system.NativeStart.main(本机方法)
08-23 18:37:55.624:I/dalvikvm(12540):“AsyncTask#34”优先级=5 tid=42监视器

对不起,这么长的解释。我找不到更简短的方法来解释我的问题。如有任何建议,将不胜感激。非常感谢。

创建自己的请求队列,将每个“发送图片”请求放入队列,并使用一个邮件任务处理队列中的请求。使用单个连接发送队列中的所有请求,直到队列为空,然后关闭连接并等待下一个请求。

您的答案看起来很有希望,但您能给我一些参考链接来帮助我实现这一点吗?请看java.util.queue,实现它的类,以及子接口阻塞队列。这些课程的例子应该让你开始学习。
08-23 18:37:55.609: I/dalvikvm(12540): DALVIK THREADS:
08-23 18:37:55.609: I/dalvikvm(12540): "main" prio=5 tid=1 WAIT
08-23 18:37:55.609: I/dalvikvm(12540):   | group="main" sCount=1 dsCount=0 s=N obj=0x401b8968 self=0xcd38
08-23 18:37:55.609: I/dalvikvm(12540):   | sysTid=12540 nice=0 sched=0/0 cgrp=default handle=-1345017816
08-23 18:37:55.609: I/dalvikvm(12540):   at java.lang.Object.wait(Native Method)
08-23 18:37:55.609: I/dalvikvm(12540):   - waiting on <0x48718010> (a android.os.MessageQueue)
08-23 18:37:55.609: I/dalvikvm(12540):   at java.lang.Object.wait(Object.java:288)
08-23 18:37:55.617: I/dalvikvm(12540):   at android.os.MessageQueue.next(MessageQueue.java:146)
08-23 18:37:55.617: I/dalvikvm(12540):   at android.os.Looper.loop(Looper.java:110)
08-23 18:37:55.624: I/dalvikvm(12540):   at android.app.ActivityThread.main(ActivityThread.java:4632)
08-23 18:37:55.624: I/dalvikvm(12540):   at java.lang.reflect.Method.invokeNative(Native Method)
08-23 18:37:55.624: I/dalvikvm(12540):   at java.lang.reflect.Method.invoke(Method.java:521)
08-23 18:37:55.624: I/dalvikvm(12540):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:871)
08-23 18:37:55.624: I/dalvikvm(12540):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:629)
08-23 18:37:55.624: I/dalvikvm(12540):   at dalvik.system.NativeStart.main(Native Method)
08-23 18:37:55.624: I/dalvikvm(12540): "AsyncTask #34" prio=5 tid=42 MONITOR