Android中的长时间运行任务

时间:2014-07-19 13:17:13

标签: android file task long-integer

我希望ZIP文件大,500MB1GB以上。我使用过AsyncTask,但它不能用于这么大的文件。

我该怎么办,处理这么长的任务?我还想用p UI更新rogress bar,我该怎么做?

2 个答案:

答案 0 :(得分:2)

  

我想要ZIP文件大,大约500MB或超过1GB。一世   已经使用过AsyncTask,但它不能处理如此大的文件。

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

  

我该怎么办,处理这么长的任务?我也想更新   带有进度条的UI,我该怎么做?

对于长任务通常使用IntentService,它也直接用于此目的,但它不能通过它的本机实现方式提供如何与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 (例如在您的来电者活动中):

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.xml 1

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

希望它有助于解决您的问题。


1 否则你的IntentService永远不会被执行(即使你开始它)。

答案 1 :(得分:1)

为什么不使用Executor? AsyncTask不适合长时间工作。你应该基本上使用java.util.concurrent pacakge,例如Executor,ThreadPoolExecutor和FutureTask。请参阅有关AsyncTask的Android SDK文档。

AsyncTask旨在成为Thread和Handler的辅助类,并不构成通用的线程框架。理想情况下,AsyncTasks应该用于短操作(最多几秒钟。)如果需要保持线程长时间运行,强烈建议您使用java.util.concurrent pacakge提供的各种API,例如Executor,ThreadPoolExecutor和FutureTask。