在写的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、总结
这样感觉代码整洁些,下载操作什么的都可以统一处理。
大家可以参考下这位大神的:地址,请点击!