安卓的AsyncTask问题

4

请问有没有人能提供以下建议: 我正在尝试执行来自Android帮助页面的代码,但是它对我不起作用:

public class DownloadFilesTask extends AsyncTask<String, Integer, Long> {
        protected Long doInBackground(String... urls) {
            Log.e("TuneWiki", "Exec");
            return 1l;
        }

        @Override
        protected void onPostExecute(Long result) {
            Log.e("TuneWiki", "Post");
        }
}

当我执行任务时,doInBackground被正确调用,但是onPostExecute从未被调用 :(
在Milestone上进行了测试,使用的是2.1操作系统。

2
嗯,我认为目前看起来还不错。你能否发布一下调用 execute(...) 方法的代码?另外,如果你不使用 Progress 类型,你可以写成 <String, Void, Long> - Hamy
1
这是另一个使用AsyncTask的示例项目:http://github.com/commonsguy/cw-android/tree/master/Threads/Asyncer/ - CommonsWare
我发现这个链接非常有帮助。滚动到线程之后。我认为它可能会帮助你理解问题... http://www.bogotobogo.com/Android/android22Threads.html - Shouvik
2个回答

6

感谢大家 - 我找到了原因。如果在启动许多线程之前就已经启动了很多线程,即使所有线程都成功完成,AsyncTask也会因某种原因停止工作。


1

使用AsyncTasks进行文件下载并不是一个好主意(正如您的AsyncTask名称所示)。AsyncTasks不应该用于长时间运行的操作,例如网络操作。实际上,AsyncTask有两个主要问题:

  • 它们与活动生命周期的关联性较差
  • 它们很容易创建内存泄漏。

RoboSpice Motivations应用程序(可在Google Play上获得)中,我们详细回答了这个问题。它将深入介绍AsyncTasks、Loaders、它们的特点和缺点,并向您介绍网络请求的替代解决方案:RoboSpice。

我们甚至提供了一份信息图表来解释这个问题。简而言之

  • AsyncTasks存在缺陷,因为它们与Activity生命周期的关联性较差,并且会导致内存泄漏。
  • Loaders非常适合其设计目的:访问Sqlite数据库的游标,但不提供任何网络支持。对于此类任务,它们是错误的工具。
  • RoboSpice在服务中执行网络请求,您的下载将在Android服务中执行,内存得到很好的管理,甚至提供了编写REST请求的支持。

我鼓励您下载RoboSpice Motivations应用程序,它真正深入解释了这一点,并提供了不同方式进行后台操作的示例和演示。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接