Android 运行多个AsyncTask将退出应用程序,而不显示任何特定错误
在我的应用程序中,我有一个非常简单的任务要做 1.当按下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
硬件
音量
按钮时,使用自定义相机
类拍摄图像。一旦开始拍摄,它应以固定间隔(比如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