为什么进程没有在后台运行?

时间:2014-07-16 12:12:58

标签: java android android-asynctask

我有一个 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 方法)

提前致谢

2 个答案:

答案 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作为锁并同步你的线程。如果您不知道该怎么做,请询问,我会更新我的答案。