Android:AsyncTask,onPostExecute在doInBackground完成之前启动
问题描述:
几个小时前我有这个问题(Android: AsyncTask, my 1st task has not finished when the other starts)我把它解决了,但后来我意识到我有类似的问题。Android:AsyncTask,onPostExecute在doInBackground完成之前启动
这是我的主类 “GameActivity”
public void mainmethod()
Log.w("GAMEACTIVITY","actionup");
myAsyncRunnable mar = new myAsyncRunnable(GameActivity.this);
mar.execute("fire");
public void doPhotoTask() {
PhotoTask photoTask = new PhotoTask(camera,surfaceCamera,isPreview,holder,GameActivity.this);
photoTask.execute(null);
}
在myAsyncRunnable.fire
()我有一个环而改变gameActivity一个ImageView的> 10倍的图像。我希望在最后的图像已经改变 在这里,在myAsyncRunnable的代码扩展的AsyncTask
@Override
protected Void doInBackground(String... params) {
fire();
return null;
}
public void fire() {
final ImageView image3 = (ImageView) gameactivity.findViewById(R.id.imageView3);
final int drawables[] = new int[] {R.drawable.fire1,R.drawable.fire2,R.drawable.fire3,R.drawable.fire4,R.drawable.fire5,R.drawable.fire6,R.drawable.fire7,R.drawable.fire8,R.drawable.fire9,R.drawable.fire10,R.drawable.fire11,R.drawable.fire12,R.drawable.fire13,R.drawable.fire14,R.drawable.fire15,R.drawable.fire16};
for (int i=0;i<drawables.length;i++) {
final int j=i;
Runnable runnable = new Runnable() {
@Override
public void run() {
image3.setImageResource(drawables[j]);
Log.w("GAMEACTIVITY","image"+j);
}
};
gameactivity.handler.postDelayed(runnable, 200*j);
}
}
@Override
protected void onPostExecute(Void result) {
Log.w("GAMEACTIVITY","ONPOSTEXECUTE");
gameactivity.doPhotoTask();
}
在PhotoTask
@Override
protected Void doInBackground(Boolean... params) {
camera.takePicture(null,null, myPictureCallback_JPG);
Log.w("GAMEACTIVITY","TAKEPICTURE");
return null;
}
我的日志猫
02-11 16:03:32.920: W/GAMEACTIVITY(7750): actionup
02-11 16:03:33.010: W/GAMEACTIVITY(7750): image0
02-11 16:03:33.010: W/GAMEACTIVITY(7750): ONPOSTEXECUTE
02-11 16:03:33.030: E/QualcommCameraHardware(99): takePicture(479)
02-11 16:03:33.100: E/QualcommCameraHardware(99): rawsize = 460800 cbcr offset =307200
02-11 16:03:33.110: E/QualcommCameraHardware(99): takePicture: X
02-11 16:03:33.110: W/GAMEACTIVITY(7750): TAKEPICTURE
02-11 16:03:33.120: E/mm-camera(99): camera_ops_start, CAMERA_OPS_CAPTURE_AND_ENCODE mode 1
02-11 16:03:33.350: W/GAMEACTIVITY(7750): image1
02-11 16:03:33.490: W/GAMEACTIVITY(7750): image2
02-11 16:03:33.780: W/GAMEACTIVITY(7750): image3
02-11 16:03:33.880: W/GAMEACTIVITY(7750): image4
02-11 16:03:34.110: W/GAMEACTIVITY(7750): image5
02-11 16:03:34.250: W/GAMEACTIVITY(7750): image6
02-11 16:03:34.490: W/GAMEACTIVITY(7750): image7
02-11 16:03:34.680: W/GAMEACTIVITY(7750): image8
02-11 16:03:34.880: W/GAMEACTIVITY(7750): image9
02-11 16:03:35.050: W/GAMEACTIVITY(7750): image10
02-11 16:03:35.110: E/QualcommCameraHardware(99): receiveRawPicture: E
02-11 16:03:35.280: W/GAMEACTIVITY(7750): image11
02-11 16:03:35.440: W/GAMEACTIVITY(7750): image12
02-11 16:03:35.500: E/QualcommCameraHardware(99): address of Jpeg 0 encoded buf 1085800448 Jpeg Heap base 1085800448
02-11 16:03:35.500: W/GAMEACTIVITY(7750): FIRST
02-11 16:03:36.470: W/GAMEACTIVITY(7750): INTENT
02-11 16:03:36.580: W/GAMEACTIVITY(7750): image13
02-11 16:03:36.710: W/GAMEACTIVITY(7750): image14
02-11 16:03:36.800: W/GAMEACTIVITY(7750): image15
02-11 16:03:37.320: W/GAMEACTIVITY(7750): SURFACEDESTROYED
答
所以,问题是你计时未来可运行为未来的执行,然后从doInBackground返回 - 这immidiatly激活你onPostExecute功能。
解决您的问题的方法不是使用onPostExcute,而是使用您想要在所有其他Runnable之后运行的代码来计时另一个Runnable,因为它们都运行在同一个线程上,这可以解决您的问题。
答
试试这个小photoTask启动改变,它可能会帮助你。
Runnable runnable = new Runnable() {
@Override
public void run() {
image3.setImageResource(drawables[j]);
Log.w("GAMEACTIVITY","image"+j);
gameactivity.handler.postDelayed(this, 200*j);
}
};
gameactivity.handler.postDelayed(runnable, 10);
我有问题。当我写“gameactivity.handler.postDelayed(runnable,200 * j);”执行该行之后,在doBackground方法中运行200毫秒还是运行在外? – morg 2013-02-11 16:44:12
http://developer.android.com/reference/android/os/Handler.html 看看PostDelayed。 它会在gameactivity线程上运行(不在后台,如果你正在更新ui,这很好)。 – Raanan 2013-02-11 16:46:42
非常感谢你,我定时另一个runnable做doPhotoTask() – morg 2013-02-11 16:54:49