2012-02-08 70 views
0

我有以下CameraPreview类,它具有此setPreviewCallback实现它将运行一个静态线程。Android - 线程问题。一个静态工作线程和两个不同的AsyncTasks

mCamera.setPreviewCallback(new Camera.PreviewCallback() { 
    public void onPreviewFrame(byte[] data, Camera arg1) { 
     ... 
     AThread thread = new AThread(data, ....); 
     thread.start(); 
     Preview.this.invalidate(); 
     .... 
    } 
}); 

而且有两个的AsyncTask(TaskOne和TaskTwo)的静态线程。

private static final class AThread extends Thread { 
    ... 
    ... 
    @Override 
    public void run() { 
     if (....) { 
      Looper.prepare(); 
      new TaskOne().execute(.....); 
      ... 
      ... 
      if (.............) { 
       // Log.d(.....) // message is printed 
       new TaskTwo().execute(.....); // doInBackground not executed.. why? 
       // Log.d(.....) // message is NOT printed.. why?? 
      } 
     } 
    } 
} 

没有错误。 TaskOne将被执行。但是,即使条件成立,TaskTwo也不会执行。我做了一个Log.d,但它确实进入了,但是TaskTwo从不执行。我认为有一个线程/队列问题。谁能帮我解决这个问题吗?

编辑: 我读后,就像一个线程上只能有一个AsyncTask。我认为TaskTwo没有添加,因为TaskOne尚未完成。我对吗??

+0

新的TaskOne().execute(.....)刚开始执行TaskOne,它不会等到它结束......所以如果“如果”statment依赖于在TaskOne中所做的更改,它将永远不会是真的..无论如何,没有必要使用多个AsyncTask,尤其是当你使用新线程时... – Selvin 2012-02-08 13:26:40

+0

if语句不依赖于TaskOne。我需要一个新的AsyncTask,因为他们都在做一个单独的任务。 – humansg 2012-02-08 14:53:36

回答

0

您可以在一个Activity中使用两个不同的AsyncTask。我会坚持不要从任何线程调用AsyncTask,而是从MainUIthread本身执行它。如果您在拨打另一个AsyncTask时遇到问题,则可以在正在运行的AsyncTaskpostExecute()中放置一个标记,以获取它已完成的状态。另一种是你可以尝试使用getStatus()来获得AsyncTask的当前状态。

+0

@Poptani AsyncTasks不从UI线程调用。它在工作线程中被调用,因为它依赖于工作线程中的数据/信息。什么应该是正确的方法?它是[代码](http://code.google.com/p/android-motion-detection/source/browse/trunk/src/com/jwetherell/motion_detection/MotionDetectionActivity.java)的一部分,但我添加了另一个AsyncTask执行我自己的任务,它依赖于该工作线程中的数据。 – humansg 2012-02-09 07:28:33

+0

AsyncTasks'doingInBackground()'本身是在工作线程(bacground)中执行的,那么为什么你需要从线程调用asynctask。 – 2012-02-09 07:33:08

+0

@Poptani由于OOP,我以前编写了AsyncTask函数来执行任务(由UI线程调用)。由于我在这里需要相同的函数来执行(相同)任务,因此我只是简单地调用了初始化AsyncTask对象。 – humansg 2012-02-09 08:50:36

0

试试这个您的AsyncTask:

if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.HONEYCOMB) { 
    myTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); 
} 
else { 
    myTask.execute(); 
} 

看来你需要并行任务。 这里澄清: (link)