第二阶段 2、添加多线程任务,完善下载,暂停,继续,取消四个功能

问题描述:添加多线程下载任务
解决方案:增加线程池,通过线程池去启动下载任务

1、DownloadService

onCreate()方法中添加线程池

ExecutorService mExecutors = Executors.newCachedThreadPool();

startDownload()方法中启动任务时改成线程池启动线程

private void startDownload(DownloadEntry entry) {
  DownloadTask task = new DownloadTask(entry);
  mDownloadingTasks.put(entry.id, task);
  mExecutors.execute(task);
 }
2、DownloadTask

实现Runnable方法
在run方法中调用start()方法

@Override
 public void run() {
  start();
 }

模拟下载过程中,下载的起始位置改成当前长度

for (int i = entry.currentLength; i < entry.totalLength; i++) {
   try {
    Thread.sleep(1000);
    } catch (InterruptedException e) {
    e.printStackTrace();
} 
   if (isPaused || isCancelled) {
    entry.status = isPaused ? DownloadEntry.DownloadStatus.pause : DownloadEntry.DownloadStatus.cancel;
    DataChanger.getInstance().postStatus(entry);
    // TODO if cancelled ,delete related file;
    return;
   }
   i += 1024;
   entry.currentLength += 1024;
   DataChanger.getInstance().postStatus(entry);
  }
3、activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center" >

    <Button
        android:id="@+id/mDownloadBtn"
        android:layout_width="100dp"
        android:layout_height="60dp"
        android:text="download" />

    <Button
        android:id="@+id/mDownloadPauseBtn"
        android:layout_width="100dp"
        android:layout_height="60dp"
        android:text="pause" />

    <Button
        android:id="@+id/mDownloadCancelBtn"
        android:layout_width="100dp"
        android:layout_height="60dp"
        android:text="cancel" />

</LinearLayout>

4、MainActivity

获取按钮

  mDowmloadBtn = (Button)findViewById(R.id.mDownloadBtn);
  mDownloadPauseBtn = (Button)findViewById(R.id.mDownloadPauseBtn);
  mDownloadCancel = (Button)findViewById(R.id.mDownloadCancelBtn);
  mDowmloadBtn.setOnClickListener(this);
  mDownloadPauseBtn.setOnClickListener(this);
  mDownloadCancel.setOnClickListener(this);

实例化DownloadManager

mDownloadManager = DownloadManager.getInstance(this);

在onResume()方法中注册观察者

mDownloadManager.addObserver(watcher);

在onPause()方法中注销观察者

mDownloadManager.removeObserver(watcher);

观察者匿名内部类中notifyUpdate方法

private DataWatcher watcher = new DataWatcher() {
 @Override
  public void notifyUpdate(DownloadEntry data) {
   entry = data;
   // 取消操作时,下载实例改成空
   if (entry.status == DownloadEntry.DownloadStatus.cancel)
    entry = null;
   Trace.d(data.toString());
  }
 };

onClick方法

@Override
public void onClick(View v) {
// 模拟下载Entry
if (entry == null) {
entry = new DownloadEntry();
entry.name = "test.jpg";
entry.url = "http://api.stay4it.com/uploads/test.jpg";
entry.id = "1";
}


switch (v.getId()) {
case R.id.mDownloadBtn: // 开始下载
mDownloadManager.add(entry);
break;

case R.id.mDownloadPauseBtn: // 暂停下载和恢复下载
if (entry.status == DownloadEntry.DownloadStatus.downloading) {
mDownloadManager.pause(entry);
} else if (entry.status == DownloadEntry.DownloadStatus.pause) {
mDownloadManager.resume(entry);
}
break;

case R.id.mDownloadCancelBtn: // 取消下载
mDownloadManager.cancel(entry);
break;

default:
break;
}

}

相关知识来源:
stay老兄的有心课堂-自己动手写多任务下载框架

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用Qt的多线程机制来实现任务暂停、恢复和终止功能。以下是一个基本的示例代码: ```cpp #include <QThread> #include <QMutex> #include <QDebug> // 自定义的工作线程类 class WorkerThread : public QThread { public: // 构造函数 WorkerThread(QObject *parent = nullptr) : QThread(parent), m_paused(false), m_terminated(false) {} // 提供外部控制线程暂停的方法 void pause() { QMutexLocker locker(&m_mutex); m_paused = true; } // 提供外部控制线程恢复的方法 void resume() { QMutexLocker locker(&m_mutex); m_paused = false; m_condition.wakeAll(); } // 提供外部控制线程终止的方法 void terminate() { QMutexLocker locker(&m_mutex); m_terminated = true; m_condition.wakeAll(); } protected: // 线程执行函数 void run() override { int count = 0; while (true) { // 检查是否被暂停或终止 QMutexLocker locker(&m_mutex); if (m_paused) { m_condition.wait(&m_mutex); // 等待恢复信号 } if (m_terminated) { break; } // 执行任务 qDebug() << "Count:" << count++; msleep(1000); // 休眠1秒 } } private: QMutex m_mutex; QWaitCondition m_condition; bool m_paused; bool m_terminated; }; int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); // 创建并启动工作线程 WorkerThread workerThread; workerThread.start(); // 模拟控制任务暂停、恢复和终止 QTimer timer; timer.setInterval(3000); // 3秒后暂停任务 QObject::connect(&timer, &QTimer::timeout, [&workerThread]() { qDebug() << "Pausing task..."; workerThread.pause(); }); timer.start(); QTimer timer2; timer2.setInterval(6000); // 6秒后恢复任务 QObject::connect(&timer2, &QTimer::timeout, [&workerThread]() { qDebug() << "Resuming task..."; workerThread.resume(); }); timer2.start(); QTimer timer3; timer3.setInterval(9000); // 9秒后终止任务 QObject::connect(&timer3, &QTimer::timeout, [&workerThread]() { qDebug() << "Terminating task..."; workerThread.terminate(); }); timer3.start(); return a.exec(); } ``` 在上面的示例中,我们创建了一个名为`WorkerThread`的自定义线程类,它继承自`QThread`。该类提供了三个方法来控制线程暂停、恢复和终止。 在`run()`函数中,我们使用一个无限循环来执行任务。在每次循环开始时,我们检查是否被暂停或终止。如果被暂停,则调用`m_condition.wait(&m_mutex)`等待恢复信号。如果被终止,则跳出循环,结束线程。 在主函数中,我们创建并启动了一个`WorkerThread`实例,并使用`QTimer`模拟控制任务暂停、恢复和终止。通过设置不同的定时器间隔,可以调整任务的执行时间。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值