关于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、总结
这样感觉代码整洁些,下载操作什么的都可以统一处理。
大家可以参考下这位大神的:地址,请点击!
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、总结
这样感觉代码整洁些,下载操作什么的都可以统一处理。
大家可以参考下这位大神的:地址,请点击!
相关文章推荐
- 问题函数关于SDK回调Qt函数的问题
- Java中的回调函数问题
- MFC 关于回调函数定义问题
- 2篇关于JAVA回调函数机制的文章
- Java 关于paintComponent函数问题
- 关于Java函数中的传值问题
- 关于Java和SQL交互时的ResultSet.getString(“ Column ”)函数的自动补空格问题
- 关于JAVA中split()函数遇到的一点问题
- 关于javascript基于DWR调用java函数的传值问题
- 关于Java或者Android中的回调的问题
- 关于java中的回调问题
- Java中关于函数回调和反射机制的介绍
- Java值传递和地址传递:关于String类型和集合类型作为函数参数时传值问题的测试
- 关于js中的回调函数问题
- 关于C++与Java中虚函数问题的读书笔记
- 关于SDK回调Qt函数的问题
- 关于JQuery的post回调函数不执行问题
- Java 关于中文乱码问题的解决方案与经验(转)
- 关于函数返回的局部数组的问题
- Java 关于中文乱码问题的解决方案与经验