回调接口方法简述

待实现的接口

public interface ImageCallback {
void imageLoad(Drawable image,String imageUrl);
}


回调接口的方法

//参数有一个实现回调接口的imageCallback对象
public Drawable loadDrawable(final String imageUrl,final ImageCallback imageCallback){
Log.i("AsyncLoadImage", "loadDrawable()"+imageUrl);
//如果缓存中有则从缓存中取出来
if(imageCache.containsKey(imageUrl)){
SoftReference<Drawable> softReference = imageCache.get(imageUrl);
if(softReference.get()!=null){//判断是否有drawable
return softReference.get(); //有则返回
}
}
//使用线程池下载图片
executorService.submit(new Runnable(){
@Override
public void run() {
try {
// final Drawable drawable = Drawable.createFromStream(new URL(imageUrl).openStream(), "image.jpg");
final Drawable drawable = getDrawableFormUrl(imageUrl); //调用获取数据的方法
imageCache.put(imageUrl, new SoftReference<Drawable>(drawable));//将加载的图片放入到内存中
mHandler.post(new Runnable(){
@Override
public void run() {
//调用回调接口的方法,已由imageCallback实现!
imageCallback.imageLoad(drawable,imageUrl);//接口回调
}
});
} catch (Exception e) {
throw new RuntimeException();
}
}

});
return null ;
}



一个列表适配器的getview方法,已重写


@Override
public View getView( int position, View convertView, ViewGroup parent) {
Log.i(TAG, "getView()");
if(convertView == null){
//获取布局
convertView = LayoutInflater.from(cext).inflate(R.layout.item_image, null);
//获取布局里面的ImageView组件
final ImageView imageView = (ImageView)convertView.findViewById(R.id.item_imageView);
//获取当前的图片的url地址
final String url = urlList.get(position).getImageUrl();
//为图片设置一个tag 这个很重要这样的目的是为了控制每个ImageView组件都显示对应的图片
imageView.setTag(url);
Log.i(TAG, "初始化"+(position));
//开始异步加载图片
//[color=red]实例化一个实现接口的对象,供上一段代码loadDrawable调用[/color]
Drawable drawable = asyncLoadImage.loadDrawable(url, new AsyncLoadImage.ImageCallback(){
@Override
public void imageLoad(Drawable image,String imageUrl) {
//判断当前的url地址是否为当前组件的url地址 是则加载图片
if(imageUrl.equals(imageView.getTag())){
imageView.setImageDrawable(image);
}
}
});

}else{
Log.i(TAG, "完成后的初始化"+(position));
final ImageView imageView = (ImageView)convertView.findViewById(R.id.item_imageView);
final String url = urlList.get(position).getImageUrl();
imageView.setTag(url);
Drawable drawable = asyncLoadImage.loadDrawable(url, new AsyncLoadImage.ImageCallback(){
@Override
public void imageLoad(Drawable image,String imageUrl) {
if(imageUrl.equals(imageView.getTag())){
imageView.setImageDrawable(image);


}
}
});
}

return convertView;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用接口回调是在Android开发中经常使用的一种设计模式,可以实现组件之间的解耦,让代码更加灵活和可维护。在Android Studio中使用接口回调的步骤如下: 1. 定义接口 在一个Java文件中定义一个接口,包含需要回调方法,例如: ``` public interface OnDataLoadedListener { void onDataLoaded(ArrayList<DataItem> data); } ``` 2. 实现接口 在某个Activity或Fragment中实现这个接口,并实现其中的方法,例如: ``` public class MainActivity extends AppCompatActivity implements OnDataLoadedListener { @Override public void onDataLoaded(ArrayList<DataItem> data) { // 处理数据 } } ``` 3. 设置回调 在需要调用接口的地方,创建一个接口对象,并调用其中的方法,例如: ``` public class DataManager { private OnDataLoadedListener listener; public void loadData() { // 加载数据 ArrayList<DataItem> data = loadDataFromServer(); // 调用回调方法 if (listener != null) { listener.onDataLoaded(data); } } public void setOnDataLoadedListener(OnDataLoadedListener listener) { this.listener = listener; } } ``` 4. 注册回调 在Activity或Fragment中的onCreate方法中,将实现了接口的对象注册到需要接收回调的对象中,例如: ``` public class MainActivity extends AppCompatActivity implements OnDataLoadedListener { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 注册回调 DataManager dataManager = new DataManager(); dataManager.setOnDataLoadedListener(this); } } ``` 这样,在DataManager中调用了onDataLoaded方法后,就会触发MainActivity中的onDataLoaded方法,从而实现了接口回调

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值