是否有类似onPreExecute和onPostExecute的传统线程?

时间:2012-10-15 21:54:09

标签: java android multithreading android-asynctask

我正在使用AsyncTask,只是为了这个问题而转而使用传统的Thread,原因不值得进入。

在线程启动之前和之后,我可以做些什么来执行,类似于onPre / PostExecute的功能?

例如,假设我想在线程开始之前显示加载圈,并在完成时将其关闭。我该怎么做?

对于执行后位,我正在使用thread.join(),它似乎可以解决问题。我不确定这是否可以解决它,或者如何在执行前做一些事情。

2 个答案:

答案 0 :(得分:4)

  

在线程启动之前和之后,我可以做些什么来执行,类似于onPre / PostExecute的功能?

onPreExecute() - >您在start()

上致电Thread之前执行的陈述

onPostExecute() - >从您的runOnUiThread()致电post()ViewThread,提供Runnable在主应用程序主题上执行

  

我该怎么做?

理想情况下,你不会。进度对话很糟糕。在您的UI中的某个位置放置一个进度指示器(例如,操作栏,标题栏),并禁用用户在您的线程运行时无法安全执行的一些操作。

话虽如此,你可能会在执行线程之前显示DialogFragment,然后在线程完成后通过上述机制删除片段。

  

对于执行后位,我正在使用thread.join(),它似乎可以解决问题。

伊克。这将阻止你所使用的任何线程,如果这是主要的应用程序线程,那真的很糟糕。


<强>更新

runOnUiThread()的示例:

new Thread() {
  public void run() {
    // do cool stuff
    runOnUiThread(new Runnable() {
      public void run() {
        // do other cool stuff quickly on the main application thread
      }
    );
  }
}).start();

答案 1 :(得分:0)

锁存器(例如CountDownLatch)可能是另一种有用的方法。

public class TestHarness {
public long timeTasks(int nThreads, final Runnable task)
        throws InterruptedException {
    final CountDownLatch startGate = new CountDownLatch(1);
    final CountDownLatch endGate = new CountDownLatch(nThreads);

    for (int i = 0; i < nThreads; i++) {
        Thread t = new Thread() {
            public void run() {
                try {
                    startGate.await();
                    try {
                        task.run();
                    } finally {
                        endGate.countDown();
                    }
                } catch (InterruptedException ignored) { }
            }
        };
        t.start();
    }

    long start = System.nanoTime();
    startGate.countDown();
    endGate.await();
    long end = System.nanoTime();
    return end-start;
}

}