我正在使用AsyncTask
,只是为了这个问题而转而使用传统的Thread
,原因不值得进入。
在线程启动之前和之后,我可以做些什么来执行,类似于onPre / PostExecute的功能?
例如,假设我想在线程开始之前显示加载圈,并在完成时将其关闭。我该怎么做?
对于执行后位,我正在使用thread.join(),它似乎可以解决问题。我不确定这是否可以解决它,或者如何在执行前做一些事情。
答案 0 :(得分:4)
在线程启动之前和之后,我可以做些什么来执行,类似于onPre / PostExecute的功能?
onPreExecute()
- >您在start()
Thread
之前执行的陈述
onPostExecute()
- >从您的runOnUiThread()
致电post()
或View
,Thread
,提供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;
}
}