android - Android 中的长时间运行任务

标签 android file task long-integer

我想ZIP 大文件,大约500MB 或超过1GB。我使用过 AsyncTask,但它不适用于这么大的文件。

这么长的任务我该怎么办?我还想用 p进度条 更新 UI,我该怎么做?

最佳答案

I want to ZIP files which are large, around 500MB or over 1GB also. I have used AsyncTask, but it doesn't work with such large files.

AsyncTask 不是为长任务指定的,而是为只能持续几秒钟的任务指定的。

What should I do, to handle such long tasks? I also want to update the UI with a progress bar, how can I do that?

对于长任务通常使用IntentService这也是为此目的直接指定的,但它无法通过其 native 实现方式提供如何与 UI 线程通信。

要解决此问题,您可以使用 ResultReceiver您可以通过 Intent 传递到 IntentService,然后它应该可以工作。

快速基础教程:

如何创建IntentService:

public class Worker extends IntentService {

    public static final int PROGRESS_UPDATE = 324;
    public static final String PROGRESS = "progress";

    @Override
    protected void onHandleIntent(Intent intent) {

        // Get data from Intent
        ResultReceiver r = (ResultReceiver) intent.getParcelableExtra("key");
        ...

        // do your work

        ...

        // send update to caller Activity
        Bundle data = new Bundle();
        data.putExtra(Worker.PROGRESS, value);
        r.send(Worker.PROGRESS_UPDATE, data);
        ...
    }
}

如何创建 ResultReceiver(例如在您的调用者 Activity 中):

private class WorkerReceiver extends ResultReceiver {

    public WorkerReceiver(Handler handler) {
       super(handler);
    }

    @Override
    public void onReceiveResult(int resultCode, Bundle resultData) {
       super.onReceiveResult(resultCode, resultData);
       if (resultCode == Worker.PROGRESS_UPDATE) {

          int progress = resultData.getInt(Worker.PROGRESS);
          // update your UI with current information from Worker
       }
   }
}

最后,如何执行IntentService:

Intent i = new Intent(this, Worker.class);
// put some extra data you want
i.putExtra("key", new WorkerReceiver(new Handler()));
...
startService(i);

最后不要忘记将您的 IntentService 添加到 Manifest.xml1

<service
   android:name=".Worker"
>
// here you can also define intent-filter
</service>

希望能帮到您解决问题。


1否则您的 IntentService 永远不会被执行(即使您将启动它)。

关于android - Android 中的长时间运行任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24840828/

相关文章:

python - Django 2.2 img 未加载

c - 任务的 UML 表示

c++ - 任务不会使用 OpenMP 并行运行。我的设置或代码有误吗?

android - 如何将选定的搜索建议数据发送到自定义 Activity

android - 在 android 中更改 MediaRecorder 源

java - 属性文件中的十六进制值 : JAVA

c# - System.Threading.Tasks 不遵守启动规则?

android字符串长度和格式?

android - Android Studio 0.8.2-Gradle异常?

php - 防止复制使用 dompdf 创建的 pdf 中的内容