我正在跟踪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不应该停止子级。如果不是这样的话 请告知我如何克服这个问题。
答案 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()方法的文档,单个线程用于所有异步任务。因此,如果您在异步任务中休眠,它将影响其他异步任务。