关于java回调函数问题

来源:互联网 发布:手机网络电视直播下载 编辑:程序博客网 时间:2024/06/06 19:52

在写的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() {@Overridepublic void run() {// TODO Auto-generated method stubtry {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() {@Overridepublic void run() {// TODO Auto-generated method stubtry {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() {@Overridepublic 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() {@Overridepublic void setStoredPath(String path) {// TODO Auto-generated method stubimgPath = path;mHandler.sendEmptyMessage(MSG_SETIMG);}});

这样接口中获取的数据就是下载好的路径咯。


4、总结

这样感觉代码整洁些,下载操作什么的都可以统一处理。

大家可以参考下这位大神的:地址,请点击!

0 0
原创粉丝点击