在寫的Android項目裏有很多網絡操作,當然需要單開個線程操作。可以發現一個問題,用線程操作後執行的類需要等着,就是等待網絡回傳的數據。總覺得這種等待不好,應該是自己幹自己的,結果出來後再進行處理。所以想到了Java回調方法。
1、先定義一個接口,處理返回的數據用:
package com.kong.data.interfaces;
/**
* 下載文件
*
* @author cheligeer
*
*/
public interface DownloadInterface {
public void setStoredPath(String path);
}
2、寫處理數據的方法,就是從網上下載文件:
package com.kong.data.handle;
import java.util.ArrayList;
import com.kong.data.interfaces.DownloadInterface;
import com.kong.data.net.Download;
import com.kong.data.utils.MyLog;
import android.content.Context;
import android.os.Handler;
import android.os.Message;
/**
* 處理下載文件
*
* @author cheligeer
*
*/
public class AdvHandleDownload {
private Context mContext = null;
private AdvData mAdvData = null;
private ArrayList<AdvData> mAdvDataList = null;
private String String_url = "";
private String String_storedPath = "";
private DownloadInterface mCallBack = null;
/**
* 下載單個文件
*
* @param context
* @param advData
* @param url
*/
public AdvHandleDownload(Context context, AdvData advData, String url) {
this.mAdvData = advData;
this.mContext = context;
this.String_url = url;
}
/**
* 下載多個文件
*
* @param context
* @param advDataList
*/
public AdvHandleDownload(Context context, ArrayList<AdvData> advDataList) {
this.mContext = context;
this.mAdvDataList = advDataList;
}
public void downloadFile(DownloadInterface callBack) {
mCallBack = callBack;
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
try {
String_storedPath = new Download(mContext, mAdvData)
.down(String_url);
mHandler.sendEmptyMessage(MSG_CALLBACK);
} catch (Exception e) {
MyLog.printLog(e);
}
}
}).start();
}
/**
* 批量下載
*
* @param callBack
* @param imgIndex
* 獲取存儲路徑的下標
*/
public void downloadFileList(DownloadInterface callBack, final int imgIndex) {
mCallBack = callBack;
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
try {
for (int i = 0; i < mAdvDataList.size(); i++) {
AdvData temp = mAdvDataList.get(i);
String tempPath = new Download(mContext, temp)
.down(temp.getImgUrl());
if (i == imgIndex) {
String_storedPath = tempPath;
}
}
mHandler.sendEmptyMessage(MSG_CALLBACK);
} catch (Exception e) {
MyLog.printLog(e);
}
}
}).start();
}
private void callBack() {
if (mCallBack != null) {
mCallBack.setStoredPath(String_storedPath);
}
}
private final int MSG_CALLBACK = 10;
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_CALLBACK:
callBack();
break;
}
}
};
}
看到DownloadFile可以下載一個文件,然後用Handler回調回去。
3、需要下載文件的類,調用這個處理下載函數的:
AdvHandleDownload advHandleDownload = new AdvHandleDownload(
mContext, mAdvData, mAdvData.getImgUrl());
advHandleDownload.downloadFile(new DownloadInterface() {
@Override
public void setStoredPath(String path) {
// TODO Auto-generated method stub
imgPath = path;
mHandler.sendEmptyMessage(MSG_SETIMG);
}
});
這樣接口中獲取的數據就是下載好的路徑咯。
4、總結
這樣感覺代碼整潔些,下載操作什麼的都可以統一處理。
大家可以參考下這位大神的:地址,請點擊!