關於java回調函數問題

在寫的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、總結

這樣感覺代碼整潔些,下載操作什麼的都可以統一處理。

大家可以參考下這位大神的:地址,請點擊!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章