android中關於用listview顯示多個任務,並刷新相關的進度條。

在網上查看瞭好多的相關資料,大多數是用AsyncTask來實現相關的功能。但是隻是實現瞭單個任務顯示進度的,這並不是我們想要的功能,但是我們可以參考其中的一些代碼或者思想。

話不多說,看一下完成後的相關界面。

(1)這是我們要的主界面(listview實現)

(2)vcD4KPHA+PGltZyBzcmM9″https://www.aiwalls.com/uploadfile/Collfiles/20131202/20131201154258796.jpg” alt=”\”>

(3)

(3)

(4)

看完圖片後,我來說一下我是怎樣完成該功能。

1. 創建一個實體類.

package com.icss.entity;

import java.io.Serializable;

public class DownloadInfo implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
/**
* 初始化狀態
*/
public final static int INIT = 0;
/**
* 停止下載
*/
public final static int PAUSED = 1;
/**
* 下載中
*/
public final static int DOWNING = 2;
/**
* 任務喚醒
*/
public final static int RESUME = 3;
/**
* 下載完成
*/
public final static int COMPLETED = 4;
/**
* 取消任務
*/
public final static int CALCELED = 5;
/**
* 任務id
*/
private String id;
/**
* 任務大小
*/
private long size;
/**
* 已經完成的進度
*/
private long complete;
/**
* 文件下載地址
*/
private String url;
/**
* 文件保存的路徑
*/
private String path;

/**
* 任務當前的狀態
*/
private int status;

public int getStatus() {
return status;
}

public void setStatus(int status) {
this.status = status;
}

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public long getSize() {
return size;
}

public void setSize(long size) {
this.size = size;
}

public long getComplete() {
return complete;
}

public void setComplete(long complete) {
this.complete = complete;
}

public String getUrl() {
return url;
}

public void setUrl(String url) {
this.url = url;
}

public String getPath() {
return path;
}

public void setPath(String path) {
this.path = path;
}

}

2.創建一個Observable。可能你會奇怪,為什麼要創建這樣一個東西。其實你也可以用廣播來實現,但是本人喜歡用觀察者模式多點。這個類的作用是用來提醒觀察隊列中的成員來接收觀察者發送過來的數據。相信大傢應該都知道我的想法瞭,沒錯,我就是加adapter加入隊列中,接收下載時的DownloadInfo數據,並刷新adapter.

3.線程。使用瞭AsyncTask類。並在後臺執行時,啟動線程去下載任務。 當然 你要把DownloadInfo作為參數放在AsyncTask類中,下載的同時,判斷任務的狀態,如果是下載狀態就修改DownloadInfo中的下載進度數據,並通過Observable將更新的DownloadInfo發送到各個觀察隊列中去,提醒它們接收數據,並刷新ui。

4.adapter 類 implements Observer 並加入觀察隊列。

private Map infomap = new HashMap(); 將從下載器發送過來的DownloadInfo放進去,String 為任務的id。

(1)getview()函數中的一些方法

//任務不在infomap中,將其加進去,並設置相關的ui。

if (!infomap.containsKey(info.getId())) {
infomap.put(info.getId(), info);

//根據任務來設置item的ui。

setitembackground(info, holder);
}
if (infomap.containsKey(info.getId())) {
final DownloadInfo tinfo = infomap.get(info.getId());
setitembackground(tinfo, holder);

//設置相關的按鈕事件

}

//設置相關的ui

private void setitembackground(DownloadInfo info, MyActiveViewHolder holder) {
String text = “開始”;
int progress = 0;
switch (info.getStatus()) {
case DownloadInfo.DOWNING:
text = “下載中”;
break;
case DownloadInfo.PAUSED:
text = “暫停”;
break;
case DownloadInfo.COMPLETED:
text = “完成”;
break;
default:
break;
}
progress = (int) info.getComplete();
holder.getStartButton().setText(text);
holder.getTextView().setText(progress + “%”);
}

(2)

public void update(Observable observable, Object data) {
if (data instanceof DownloadInfo) {
DownloadInfo task = (DownloadInfo) data;
if(task.getStatus()!=DownloadInfo.CALCELED)
{
infomap.put(task.getId(), task);
}
this.notifyDataSetChanged();
}
}

就寫到這裡瞭,工程,我有個時間上傳給大傢。我的資源裡有一個apk的例子,大傢可以下載來看看。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *