我知道这个问题已被多次询问,但我得到的所有答案对我来说都不清楚。
我想实现文件删除过程。我发现要做这种工作,建议在分离的线程中运行所有进程。
为此,我可以使用AsyncTask
,Handler
和Thread
。 AsyncTask
似乎是一个很好的解决方案。但是,AsyncTask
是专为小型任务而设计的。 (当我尝试删除长度超过1G的文件时,AsyncTask
崩溃或无法执行onPostExecute
。
其他线程处理程序(Thread
,Runnable
...)无法管理UI(更新UI或显示进度)。
我的问题是什么是长任务的优秀线程处理程序以及如何使用它来管理UI。
答案 0 :(得分:4)
首先,如果您需要在主线程之外执行工作,但仅在用户与您的应用程序交互时,您应该创建一个新线程,否则使用服务。
现在,您可以使用AsyncTask执行所有操作,也可以使用Thread(+ Handler)执行此操作。但AsyncTask使开发人员的工作更容易,因为它旨在将工作线程与主线程(调用者线程)进行通信。现在,如果您使用Hanlder,您还可以使用调用者线程传递工作线程(请注意,调用者线程不一定是主线程,它可以是两个工作线程之间的通信),如果调用者线程是主线程,你最好使用AsyncTask。
据我所知,它是这样的:
答案 1 :(得分:0)
对我来说最好的是Asynctask,因为结构定义明确,你可以知道何时运行线程以及何时显示结果。
答案 2 :(得分:0)
http://masl.cis.gvsu.edu/2010/04/05/android-code-sample-asynchronous-http-connections/
关于使用上述处理程序的好文章。
使用处理程序删除:
创建一个可以完成三件事的runnable:
删除档案
获取消息并发送成功
获取消息并发送失败
使用一些框架来管理线程或使用并发包,发布runnable,它将执行文件Del off主线程。处理程序回调将是msg成功或msg失败,将在主线程wherview控制器上处理。
答案 3 :(得分:0)
查看Needle,你可以忘记Handler和AsyncTasks。 Needle是一款开源,简单但功能强大的Android多线程库。有了它,你可以说:
Needle.onMainThread().execute(new Runnable() {
@Override
public void run() {
// e.g. change one of the views
}
});
或
Needle.onBackgroundThread().execute(new UiRelatedTask<Integer>() {
@Override
protected Integer doWork() {
int result = 1+2;
return result;
}
@Override
protected void thenDoUiRelatedWork(Integer result) {
mSomeTextView.setText("result: " + result);
}
});
在GitHub上查看:https://github.com/ZsoltSafrany/needle