我有一个 XX 方法需要2秒钟。我想在它之前做一些事情,当 XX 方法结束时,我想做另一件事。
它工作正常,但问题是当 XX 方法完成时所做的一切,我的意思是必须在 XX 之前运行的方法以及必须在 XX 在 XX 方法完成后工作。
runOnUiThread(new Runnable() {
@Override
public void run() {
beforeXX();
}
});
XX();//takes 2 seconds
runOnUiThread(new Runnable() {
@Override
public void run() {
afterXX();
}
});
afterXX(); 和 beforeXX(); 都是更改视图。 (我也尝试过 AsyncTask 方法)
提前致谢
答案 0 :(得分:2)
从评论中移出
我认为你可能会在那里创建一个竞争条件,因为beforeXX
在调用xx()
之前可能会或者可能不会完成,并且鉴于命名 - before
需要完全运行在xx
开始之前。然后xx
阻止,直到您完成为止。 AsyncTask
绝对是一种更好的方法。
以例如:
// The three generics here are:
// 1) What is passed into doInBackground (invoked via .execute())
// 2) onProgressUpdate params (I didn't include that)
// 3) What is passed into onPostExecute
public class DoMyBackendWork extends AsyncTask<String, Void, String> {
@Override
protected void onPreExecute() {
// do beforeXX(); stuff here, this runs on the UI thread
}
@Override
protected String doInBackground(String... filePaths) {
// do the xx(); code here. It will be sequential, such as:
// data = expensiveSetup();
// procData = processData(data);
// expensivePostDataThatCanBeDoneInBackground(procData);
// return strings...; This goes to onPostExecute
}
@Override
protected void onPostExecute(String result) {
// do afterXX(); stuff here, this runs on the UI thread
// this data comes from the return of doInBackground
}
private void expensiveSetup() {}
private ProcessedData processData(Data data) {}
private void expensivePostDataThatCanBeDoneInBackground(ProcessedData data) {}
}
然后在你从以下地方打电话的地方:
DoMyBackendWork dmbw = new DoMyBackendWork(/* add ctor and params if needed */);
dmbw.execute(/* string params */);
答案 1 :(得分:0)
为什么不简单地在
行中运行代码beforeXX();
XX();
afterXX();
您编写的内容无法保证按照您的代码编写顺序和您期望的方式执行,因为线程管理属于操作系统而不是您作为程序员。
至少可以解决问题的方法是等待 forXX和afterXX之前的线程完成。我想到的第一件事是使用一个Object作为锁并同步你的线程。如果您不知道该怎么做,请询问,我会更新我的答案。