android 关于多任务下载问题

关于多任务下载问题

  

近期项目中,遇到一个问题,列表数据中的图片地址是一个需要下载JS再解析的字段,之前的图片下载是一个异步的过程,由一个队列处理。

 

Android系统以不同寻常的方式处理多个应用程序的同时运行。来自于其它不同平台的开发者或许会对这样的运行机制感到很奇怪。而理解Android多任务的运行,对于设计出可以良好运行的应用程序,以及与Android平台的其它部分进行无缝结合都具有重要意义。这篇文章说明了Android的多任务方式设计上的成因,它对应用程序运行产生的影响,还有你可以怎样更好地利用Android的这一特性。

近期项目中,遇到一个问题,列表数据中的图片地址是一个需要下载JS再解析的字段,之前的图片下载是一个异步的过程,由一个队列处理。


  1. public class ImageTaskExecutor { 
  2.  
  3.  
  4.     /** 存放任务的链表,first-in last-out */ 
  5.     private LinkedList<ImageTask> mTaskQueue = null; 
  6.  
  7.  
  8.     /** 执行任务的线程 */ 
  9.     private ThreadUnit mThreadUnit = null; 
  10.      
  11.     /** 执行任务的间隔时间 */ 
  12.     public static final long WAIT_PERIOD = 50L; 
  13.      
  14.     private volatile boolean paused; 
  15.     private final Object signal = new Object(); 
  16.      
  17.     /** 
  18.      * 添加新任务 
  19.      *  
  20.      * @param task 
  21.      * @return 是否添加成功 
  22.      */ 
  23.     public synchronized boolean addNewTask(final ImageTask task) { 
  24.         if (mThreadUnit == null) { 
  25.             mThreadUnit = new ThreadUnit(); 
  26.             mTaskQueue = new LinkedList<ImageTask>(); 
  27.             new Thread(mThreadUnit).start(); 
  28.         } 
  29.          
  30.         return mTaskQueue.offer(task); 
  31.     } 
  32.  
  33.  
  34.     class ThreadUnit implements Runnable { 
  35.  
  36.  
  37.         public boolean isRunning = false; 
  38.         private ImageTask task = null; 
  39.  
  40.  
  41.         @Override 
  42.         public void run() { 
  43.             try { 
  44.                 isRunning = true; 
  45.                 while (isRunning) { 
  46.                     while (mTaskQueue != null && mTaskQueue.isEmpty()) { 
  47.                         try { 
  48.                             Thread.sleep(WAIT_PERIOD); 
  49.                         } catch (InterruptedException e) { 
  50.                             e.printStackTrace(); 
  51.                         } 
  52.                     } 
  53.                     synchronized (signal) { 
  54.                         while (paused) { // pause point 
  55.                             signal.wait(); 
  56.                         } 
  57.                     } 
  58.                     if (mTaskQueue != null && !mTaskQueue.isEmpty()) { 
  59.                         task = mTaskQueue.removeFirst(); // 取出链表中的最后一个任务 
  60.                         if (task != null) { 
  61.                             task.execute(); 
  62.                         } 
  63.                     } 
  64.                 } // end while 
  65.             } catch (Exception e) { 
  66.                 e.toString(); 
  67.             } 
  68.         } // end run 
  69.     } 
  70.      
  71.     /** 
  72.      * 中断任务的执行 
  73.      */ 
  74.     public void pauseTaskThread() { 
  75.         setPaused(); 
  76.     } 
  77.      
  78.     private void setPaused() { 
  79.         synchronized (signal) { 
  80.             paused = true; 
  81.         } 
  82.     } 
  83.  
  84.  
  85.     private void setUnpaused() { 
  86.         synchronized (signal) { 
  87.             paused = false; 
  88.             signal.notify(); 
  89.         } 
  90.     } 
  91.      
  92.     /** 
  93.      * 恢复任务的执行 
  94.      */ 
  95.     public void resumeTaskThread(){ 
  96.         setUnpaused(); 
  97.     } 
  98.      
  99.  
  100.  
  101.     /** 
  102.      * 终止任务的执行 
  103.      */ 
  104.     public void terminateTaskThread() { 
  105.         if (mThreadUnit != null) { 
  106.             mThreadUnit.isRunning = false; 
  107.         } 
  108.         if (mTaskQueue != null) { 
  109.             mTaskQueue.clear(); 
  110.         } 
  111.         mThreadUnit = null; 
  112.         mTaskQueue = null; 
  113.     } 

现在列表中的图片信息需要解析,如果再开一个队列,页面直接卡得不动了。。。

然后,这时候就考滤整个下载JS然后再下载图片这个过程需要使用同步操作了

后来发现,这个过程操作会比较长,页面的开始出现第一项的图片闪跳

原来adapter里面的getView 方法,被调用的过程中,contentview里面的内容会被随机复用,然后就。。。


  1. public void inflateTaobaoImage(final String jsonUrl, final View view, 
  2.             final int error_bg_Id) { 
  3.         if (jsonUrl == null || jsonUrl.equals("")) { 
  4.             return; 
  5.         } 
  6.  
  7.  
  8.         String imgUrl = getImgUrl(jsonUrl); 
  9.         if (!TextUtils.isEmpty(imgUrl)) { 
  10.             final String originJsonUrl = (String) view.getTag(IMG_TAG); 
  11.             if (TextUtils.equals(originJsonUrl, jsonUrl)) { 
  12.                 LogsPrinter.debugError(TAG, "inflateTaobaoImage in HashMap " 
  13.                         + originJsonUrl + " " + view); 
  14.                 inflateImage(imgUrl, view, error_bg_Id); 
  15.             } 
  16.         } else { 
  17.             mTaskExecutor.addNewTask(new ImageTask(jsonUrl) { 
  18.                 @Override 
  19.                 public void execute() { 
  20.                     String taobaoImgUrl = downloadUrlString(jsonUrl 
  21.                             + "&callback=success_jsonpCallback"); 
  22.  
  23.  
  24.                     final String imgUrl = getTaobaoImageUrl(taobaoImgUrl); 
  25.                     LogsPrinter.debugError("add map", imgUrl + " " + jsonUrl); 
  26.                     taobaoImgMap.add(imgUrl, jsonUrl); 
  27.  
  28.  
  29.                     final String originJsonUrl = (String) view.getTag(IMG_TAG); 
  30.                     if (TextUtils.equals(originJsonUrl, jsonUrl)) { 
  31.                         baseHandlers.post(new Runnable() { 
  32.  
  33.  
  34.                             @Override 
  35.                             public void run() { 
  36.                                 inflateImage(imgUrl, view, error_bg_Id); 
  37.                             } 
  38.                         }); 
  39.                     } 
  40.                 } 
  41.             }); 
  42.         } 
  43.     } 

值得注意的一个问题是:

settag的值需要是一个固定的值。不然,有时候会出现加载多次的情况。。

时间: 2024-09-20 08:38:24

android 关于多任务下载问题的相关文章

ftp服务器-iphone上FTP 多任务下载问题

问题描述 iphone上FTP 多任务下载问题 具体过程是这样的: 线程里,创建了CFReadStreamCreateWithFTPUR一个流, scheduleInRunLoop然后open.接着就在CFRunLoopRun();接收是在CFNetwork框架里的- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode 中接收并些文件. 这样的线程共有2个,我调试发现 只有一个loop循环里来消息,另一个tr

listview多任务下载-Android ListView中多任务下载是如何实现的(给点思路)

问题描述 Android ListView中多任务下载是如何实现的(给点思路) 最近在项目中有个多任务下载的功能,我把下载的类和方法全部都写好了,就是不知道多任务是如何实现的,网上有人说是写个下载管理器,还望各位大牛给说一下思路.类似于这个效果的..这个只是一个虚拟的更新进度条,没实现多任务下载 解决方案 直接使用多线程来下载不同任务,定时刷新进度.

android 多线程断点续传下载 二

在上一节中,我们简单介绍了如何创建多任务下载,但那种还不能拿来实用,这一集我们重点通过代码为大家展示如何创建多线程断点续传下载,这在实际项目中很常用. main.xml: [html] view plaincopy <?xml version="1.0" encoding="utf-8"?>   <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android&

android源码下载方式

android源码下载方式: 方式一: 1) 创建~/bin $ mkdir ~/bin$ PATH=~/bin:$PATH 2) 下载repo $ curl https://dl-ssl.google.com/dl/googlesource/git-repo/repo > ~/bin/repo$ chmod a+x ~/bin/repo 3) 创建保存Android源码文件 $ mkdir WORKING_DIRECTORY$ cd WORKING_DIRECTORY 4 ) 下载Androi

android 从ftp下载sqlite数据库后覆盖原有数据库,为什么不能运行?

问题描述 android 从ftp下载sqlite数据库后覆盖原有数据库,为什么不能运行? android的sqlite数据库,存在data/data/packagename/databases/下, 用org.apache.commons.net.ftp.FTPClient 上传数据库到ftp,再下载下来后,为什么提示损坏,打不开? 我测试过,ftp上的文件是正确的,下载也成功了,文件有更新,文件的大小和ftp上的也是一样的.但是为什么打不开呢?用sqlexpert打开sqlite,提示dat

Android源码下载及开发环境的搭建

1.前言         前一博文给自己列了一下Android的学习计划,是时候一个个的完成了.如计划列的,我要写的第一篇是<Android源码 的下载及开发环境的搭建>,致于如何去下载源码,其实网上已经一大堆的帖子了,一搜就有.但在这里,我想说,一个源码的下载,不是简单的把源码下载下来之 样就OK了,就可以开始你的源码学习之旅.要想更好的学习源码和进行开发,一个适合自己的开发环境还是必不可少的,这里我会列出来我给自己准备的开发环境 的做法,不能说明是最优的,但至少我感觉对我来说还是挺方便的.

android 多线程断点续传下载 三

今天跟大家一起分享下android开发中比较难的一个环节,可能很多人看到这个标题就会感觉头很大,的确如果没有良好的编码能力和逻辑思维,这块是很难搞明白的,前面2次总结中已经为大家分享过有关技术的一些基本要领,我们先一起简单回顾下它的基本原理. http://blog.csdn.net/shimiso/article/details/6763664  android 多线程断点续传下载 一 http://blog.csdn.net/shimiso/article/details/6763986 

摄像头-linux上传完文件后,另一台Android手机自动下载这个可以实现么

问题描述 linux上传完文件后,另一台Android手机自动下载这个可以实现么 linux我用摄像头拍照上传到ftp去 但是我Android要一直看着ftp才能把它下下来 可以让它自动判断ftp状态 然后上传完了自动下下来么 解决方案 如果是简单的学生习作程序,另一个程序不断轮询服务器就可以了.

Android实现多线程下载图片的方法_Android

很多时候我们需要在Android设备上下载远程服务器上的图片进行显示,今天整理出两种比较好的方法来实现远程图片的下载.  方法一.直接通过Android提供的Http类访问远程服务器,这里AndroidHttpClient是SDK 2.2中新出的方法,API Level为8,大家需要注意下,静态访问可以直接调用,如果SDK版本较低可以考虑Apache的Http库,当然HttpURLConnection 或URLConnection也可以. static Bitmap downloadBitmap