gpt4 book ai didi

android - 从 Handler 调用的 AsyncTask 不会执行 doInBackground

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:39:07 28 4
gpt4 key购买 nike

我正在开发的应用程序使用后台线程通过 API 下载图像列表,然后在幻灯片中显示图像。

有一个后台任务(当前为 AsyncTask)定期获取新图像。

我没有收到有关错误线程等的任何错误消息,只是 AsyncTasks 的第二个实例不会运行 doInBackground 方法。

这是 Activity 中的一些代码:

private DownloadTask mDownloadTask = null;
private Handler mHandler;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
if(mDownloadTask != null) {
mDownloadTask.cancel(true);
}
mDownloadTask = new DownloadTask();
mDownloadTask.execute((Void[]) null);
}
};

mDownloadTask = new DownloadTask();
mDownloadTask.execute((Void[]) null);
}

DownloadTask 如下所示:

@Override
protected List<String> doInBackground(Void... voids) {
// Download list of URLs from server, etc.
}

@Override
protected void onPostExecute(List<String> urls) {
mHandler.sendEmptyMessageDelayed(111, 5000);
}

处理程序将被调用,onPreExecute(在 AsyncTask 中)将被调用,DownloadTask 的初始运行(在 onCreate 中)也将起作用。

根据这个问题:Android SDK AsyncTask doInBackground not running (subclass) ,可能与SDK15相关。

感谢任何提示。


更新 当我收到评论说处理程序可能不在 UI 线程中时(这很奇怪,因为 Thread.currentThread 在 onCreate 和处理程序中是相同的handleMessage方法,我修改了handleMessage方法为:

mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
runOnUiThread(new Runnable() {
@Override
public void run() {
if(mDownloadTask != null) {
mDownloadTask.cancel(true);
}
mDownloadTask = new DownloadTask();
mDownloadTask.execute((Void[]) null);
}
});
}
};

仍然没有成功。


更新完整的 DownloadTask 类

class DownloadTask extends AsyncTask<Void, Void, List<String>> {

@Override
protected void onPreExecute() {
// Cancel the animation.
if (mSlideshowAnimation != null) {
mSlideshowAnimation.cancel(true);
}

mImageView1.setVisibility(View.GONE);
mImageView2.setVisibility(View.GONE);
animate(mProgressBar).alpha(1.0f).setDuration(500).start();

Log.d(TAG, "Download preparation done.");
}

@Override
protected List<String> doInBackground(Void... voids) {
Log.d(TAG, "Download");
SharedPreferences s = getSharedPreferences("access", Context.MODE_PRIVATE);
String token = s.getString("token", null);

Log.d(TAG, "Downloading slideshows.");

List<String> urls = new ArrayList<String>();
Slideshow[] slideshows = new Api(SlideshowActivity.this).getSlideshows(token);
for (Slideshow slideshow : slideshows) {
urls.addAll(slideshow.getAllPhotoUrls());
}

Log.d(TAG, "Downloading slideshows: " + slideshows.length);

for (String url : urls) {
try {
url = Api.HOST + url;

if (!Cache.fileExists(Cache.getCacheFilenameForUrl(SlideshowActivity.this, url))) {
Cache.cacheStream(SlideshowActivity.this, HttpHelper.download(SlideshowActivity.this, url), url);
} else {
Log.d(TAG, "Cached: " + url);
}
} catch (IOException e) {
Log.e(TAG, "Error while downloading.", e);
}
}

Log.d(TAG, "Downloading slideshows finished.");

return urls;
}

@Override
protected void onPostExecute(List<String> urls) {
Log.d(TAG, "download successful");
animate(mProgressBar).alpha(0.0f).setDuration(500).start();

mCurrentImageIndex = -1;
mImageUrls = urls;

mSlideshowAnimation = new SlideshowAnimation();
mSlideshowAnimation.execute((Void[]) null);

mHandler.sendEmptyMessageDelayed(111, 5000);
}
}

最佳答案

多亏了与 Waqas 的有益讨论(谢谢!),我终于发现了代码中的错误。事实上,上面写的所有内容都是正确的并且按原样工作。我的案例的问题是第二个任务阻止了第一个任务,反之亦然。

在 Google 网上论坛上找到这篇帖子也许是巧合:http://groups.google.com/group/android-developers/browse_thread/thread/f0cd114c57ceefe3?tvc=2&q=AsyncTask+in+Android+4.0 .建议所有涉及线程的人仔细阅读此讨论。

AsyncTask 将线程模型切换为串行执行器(再次),这似乎与我拥有 2 个 AsyncTask 的方法不兼容。

最后,我将“下载”的处理切换为经典的 Thread 并使用 Handler 发布消息以在必要时取消幻灯片放映。使用处理程序 sendEmptyMessageDelayed 我将在一段时间后简单地重新创建下载线程以刷新数据。

感谢所有评论和回答。

关于android - 从 Handler 调用的 AsyncTask 不会执行 doInBackground,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10328645/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com