您的位置:首页 > 编程语言 > Java开发

关于java回调函数问题

2014-05-27 23:02 344 查看
在写的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、总结

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

大家可以参考下这位大神的:地址,请点击!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息