思路:
class A, B
在B中调用A中的方法
通过注册接口 I 来实现
I 在B中定义,在A中实现
代码
类 ThumbnailDownloader 中注册接口
package com.bignerdranch.android.photogallery;
import java.io.IOException;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import android.annotation.SuppressLint;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Message;
import android.util.Log;
public class ThumbnailDownloader<Handle> extends HandlerThread {
private static final String TAG = "ThumbnailDownloader";
private static final int MESSAGE_DOWNLOAD = 0;
Handler mHandler;
Map<Handle,String> requestMap =
Collections.synchronizedMap(new HashMap<Handle,String>());
Handler mResponseHandler;
Listener<Handle> mListener;
public interface Listener<Handle> {
void onThumbnailDownloaded(Handle handle, Bitmap thumbnail);
}
public void setListener(Listener<Handle> listener) {
mListener = listener;
}
public ThumbnailDownloader(Handler responseHandler) {
super(TAG);
mResponseHandler = responseHandler;
}
@SuppressLint("HandlerLeak")
@Override
protected void onLooperPrepared() {
mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
if (msg.what == MESSAGE_DOWNLOAD) {
@SuppressWarnings("unchecked")
Handle handle = (Handle)msg.obj;
Log.i(TAG, "Got a request for url: " + requestMap.get(handle));
handleRequest(handle);
}
}
};
}
private void handleRequest(final Handle handle) {
try {
final String url = requestMap.get(handle);
if (url == null)
return;
byte[] bitmapBytes = new FlickrFetchr().getUrlBytes(url);
final Bitmap bitmap = BitmapFactory
.decodeByteArray(bitmapBytes, 0, bitmapBytes.length);
mResponseHandler.post(new Runnable() {
public void run() {
if (requestMap.get(handle) != url)
return;
requestMap.remove(handle);
mListener.onThumbnailDownloaded(handle, bitmap);
}
});
} catch (IOException ioe) {
Log.e(TAG, "Error downloading image", ioe);
}
}
public void queueThumbnail(Handle handle, String url) {
requestMap.put(handle, url);
mHandler
.obtainMessage(MESSAGE_DOWNLOAD, handle)
.sendToTarget();
}
public void clearQueue() {
mHandler.removeMessages(MESSAGE_DOWNLOAD);
requestMap.clear();
}
}
7
类 PhotoGalleryFragment中进行接口的实现,并且传递接口
package com.bignerdranch.android.photogallery;
import java.util.ArrayList;
import android.graphics.Bitmap;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.GridView;
import android.widget.ImageView;
public class PhotoGalleryFragment extends Fragment {
GridView mGridView;
ArrayList<GalleryItem> mItems;
ThumbnailDownloader<ImageView> mThumbnailThread;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setRetainInstance(true);
new FetchItemsTask().execute();
mThumbnailThread = new ThumbnailDownloader<ImageView>(new Handler());
mThumbnailThread.setListener(new ThumbnailDownloader.Listener<ImageView>() {
public void onThumbnailDownloaded(ImageView imageView, Bitmap thumbnail) {
if (isVisible()) {
imageView.setImageBitmap(thumbnail);
}
}
});
mThumbnailThread.start();
mThumbnailThread.getLooper();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_photo_gallery, container, false);
mGridView = (GridView)v.findViewById(R.id.gridView);
setupAdapter();
return v;
}
@Override
public void onDestroy() {
super.onDestroy();
mThumbnailThread.quit();
}
@Override
public void onDestroyView() {
super.onDestroyView();
mThumbnailThread.clearQueue();
}
void setupAdapter() {
if (getActivity() == null || mGridView == null) return;
if (mItems != null) {
mGridView.setAdapter(new GalleryItemAdapter(mItems));
} else {
mGridView.setAdapter(null);
}
}
private class FetchItemsTask extends AsyncTask<Void,Void,ArrayList<GalleryItem>> {
@Override
protected ArrayList<GalleryItem> doInBackground(Void... params) {
return new FlickrFetchr().fetchItems();
}
@Override
protected void onPostExecute(ArrayList<GalleryItem> items) {
mItems = items;
setupAdapter();
}
}
private class GalleryItemAdapter extends ArrayAdapter<GalleryItem> {
public GalleryItemAdapter(ArrayList<GalleryItem> items) {
super(getActivity(), 0, items);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = getActivity().getLayoutInflater()
.inflate(R.layout.gallery_item, parent, false);
}
GalleryItem item = getItem(position);
ImageView imageView = (ImageView)convertView
.findViewById(R.id.gallery_item_imageView);
imageView.setImageResource(R.drawable.brian_up_close);
mThumbnailThread.queueThumbnail(imageView, item.getUrl());
return convertView;
}
}
}
这样就可以理解了,在类之间通过传递对象,接口等方法来实现回调。