Android使用多线程实现断点下载

2019-12-10 18:32:23于丽

  源代码如上..优化的事情我就不做了..为了方便直接就贴上了..这里定义了一个ProgressBar进度条..一个TextView来同步进度条的下载进度..在Android中我们自然不能够在主线程中去调用耗时间的操作..因此这些耗时的操作我们就通过开启子线程的方式去使用..但是子线程是不能够更新UI界面的..因此我们需要使用到Handler Message机制来完成主界面UI更新的操作.

  但是上面的代码当中我们会发现一个问题..在子线程内部居然更新了ProgressBar操作..其实ProgressBar和ProgressDialog是两个特例..我们可以在子线程内部去更新他们的属性..我们来看一下源代码的实现过程..

 private synchronized void refreshProgress(int id, int progress, boolean fromUser) {
    if (mUiThreadId == Thread.currentThread().getId()) { //如果当前运行的线程和主线程相同..那么更新进度条..
      doRefreshProgress(id, progress, fromUser, true);
    } else { //如果不满足上面说的情况..
      if (mRefreshProgressRunnable == null) {
        mRefreshProgressRunnable = new RefreshProgressRunnable();//那么新建立一个线程..然后执行下面的过程..
      }

      final RefreshData rd = RefreshData.obtain(id, progress, fromUser); //获取消息队列中的消息..
      mRefreshData.add(rd);
      if (mAttached && !mRefreshIsPosted) {
        post(mRefreshProgressRunnable); //主要是这个地方..调用了post方法..将当前运行的线程发送到消息队列当中..那么这个线程就可以在UI中运行了..因此这一步是决定因素..
        mRefreshIsPosted = true;
      }
    }
  }

  正是由于源码内部调用了post方法..将当前的线程放入到消息队列当中..那么UI中的Looper线程就会对这个线程进行处理,那么就表示这个线程是可以被执行在UI当中的..也正是这个因素导致了我们可以在子线程内部更新ProgressBar..但是我们可以看到如果我们想要去更新TextView的时候..我们就需要调用Handler Message机制来完成UI界面的更新了..因此这一块需要我们去注意。
  移植之后代码其实并没有发生太大的变化,这样就可以完成一个在Android中的多线程断点下载器了。

以上就是本文的全部内容,希望对大家学习Android软件编程有所帮助。



注:相关教程知识阅读请移步到Android开发频道。