Thread.sleep将停止所有嵌套的Asyntasks

时间:2015-07-01 18:04:45

标签: java android multithreading android-asynctask

我正在跟踪codelearn中的tutes,并尝试创建一个AsyncTask,它生成推文并执行另一个AsyncTask来写入缓存文件。 我有Thread.sleep,因此第一次加载时的UI会等待,直到将Tweets写入缓存文件。首先我执行AysncTask new AsyncWriteTweets(this.parent).execute(tweets);然后睡10秒钟。

但是在logcat中我可以看到AsyncWriteTweets也在10秒睡眠后执行。因此onPostExecute在推文写入缓存文件之前执行,给出一个空白屏幕。

public class AsyncFetchTweets extends AsyncTask<Void, Void, Void> {
    private TweetListActivity parent;
    ArrayList<Tweet> tweets = new ArrayList<Tweet>();
    ArrayList[] temp;

    public AsyncFetchTweets(TweetListActivity parent){
        this.parent = parent;
    }

    @Override
    protected Void doInBackground(Void... params) {
        int result = 0;
        Log.d("ASync", "Calling asycn");
        for (int i=0;i<4;i++){
            Tweet tweet = new Tweet();
            tweet.setTitle("Title Async Very New" + i);
            tweet.setBody("Body text for tweet no " + i);
            tweets.add(tweet);
        }
        new AsyncWriteTweets(this.parent).execute(tweets);

        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        return null;
    }

    protected void onPostExecute(Void result){
        Log.d("Async", "on Post execute");
        this.parent.renderTweets();
    }

}
  

PS:我的假设是AsyncTask应该创建一个新线程,因此   父级中的Thread.sleep不应该停止子级。如果不是这样的话   请告知我如何克服这个问题。

2 个答案:

答案 0 :(得分:2)

此:

new AsyncWriteTweets(this.parent).execute(tweets);

错误,AsyncTask必须在UI线程上执行,而不是在Worker线程上执行。您可以使用Handler并发布runnable来安全地执行它。

有关线程规则的参考信息:

  必须在UI线程上调用

execute(Params ...)。

http://developer.android.com/reference/android/os/AsyncTask.html

上述感兴趣链接的另一部分是Order of execution,:

  

从HONEYCOMB开始,任务在单个线程上执行,以避免因并行执行而导致的常见应用程序错误。

所以你的第一个asynctask必须在下一个asynctask开始之前结束,但是你通过使用executeOnExecutor(java.util.concurrent.Executor, Object[]) with THREAD_POOL_EXECUTOR.来迁移以前的并行行为仍然必须在UI线程上完成execute

答案 1 :(得分:1)

根据execute()方法的文档,单个线程用于所有异步任务。因此,如果您在异步任务中休眠,它将影响其他异步任务。

尝试executeOnExecutor