2013-02-11 65 views
0

幾個小時前我有這個問題(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 

回答

2

所以,問題是你計時未來可運行爲未來的執行,然後從doInBackground返回 - 這immidiatly激活你onPostExecute功能。

解決您的問題的方法不是使用onPostExcute,而是使用您想要在所有其他Runnable之後運行的代碼來計時另一個Runnable,因爲它們都運行在同一個線程上,這可以解決您的問題。

+0

我有問題。當我寫「gameactivity.handler.postDelayed(runnable,200 * j);」執行該行之後,在doBackground方法中運行200毫秒還是運行在外? – morg 2013-02-11 16:44:12

+0

http://developer.android.com/reference/android/os/Handler.html 看看PostDelayed。 它會在gameactivity線程上運行(不在後臺,如果你正在更新ui,這很好)。 – Raanan 2013-02-11 16:46:42

+1

非常感謝你,我定時另一個runnable做doPhotoTask() – morg 2013-02-11 16:54:49

0

試試這個小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); 
相關問題