Android中的回调机制

        从学习Android到现在,有意无意都会听到一个叫做回调机制的这么一个东东。例如Activity的生命周期函数就是通过回调机制来实现的,还有为控件添加监听事件时,所实现的接口也是通过回调机制来实现的。起初还真心不知道这是什么东东,到后来有的时候用到的时候也是直接用别人现成的代码,没有搞明白其中是怎么一个实现方式。今天就通过一个从网上下载图片,通过回调机制来通知更新UI的小例子学习了一下回调机制。

最主要的就是DownLoadImage.java类:

package com.xiaotian.callbackmechanism;

import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.os.Message;

import java.net.URL;

/**
 * 下载图片,成功后采用回调机制返回下载后的图片
 */
public class DownLoadImage {
    /**
     * 下载图片的方法
     *
     * @param imageUrl 下载图片的url
     * @param callBack 下载完成后的回调接口
     */
    public static void loadImage(final String imageUrl, final ImageCallBack callBack) {
        final Handler handler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                //通知回调
                //将下载好的bitmap传入callBack中,当实现这个方法时就可以使用下载好的bitmap了
                callBack.getBitmap((Bitmap) msg.obj);
            }
        };
        //开启新的线程去下载图片
        new Thread() {
            @Override
            public void run() {
                try {
                    BitmapDrawable bitmap = (BitmapDrawable) Drawable.createFromStream(
                            new URL(imageUrl).openStream(), "");
                    Message msg = Message.obtain();
                    msg.obj = bitmap.getBitmap();
                    //图片下载完成后通知callBack接口回调getBitmap()方法
                    handler.sendMessage(msg);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }.start();
    }

    /**
     * 定义回调接口
     */
    public interface ImageCallBack {
        //图片下载完成后回调该方法
        public void getBitmap(Bitmap bitmap);
    }
}
MainActivity.java类
package com.xiaotian.callbackmechanism;

import android.app.ProgressDialog;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;


public class MainActivity extends ActionBarActivity {
    //图片的url地址
    private String imageUrl = "https://img-blog.csdn.net/20141230130649230?watermark/2" +
            "/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGluZmVuZzI0/font/5a6L5L2T/fontsize/400" +
            "/fill/I0JBQkFCMA==/dissolve/70/gravity/Center";
    //下载等待提示框
    private ProgressDialog progressDialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //初始化提示框
        progressDialog = new ProgressDialog(this);
        progressDialog.setTitle("提示");
        progressDialog.setMessage("图片下载中...");
        //初始化控件
        final ImageView iv = (ImageView) findViewById(R.id.iv);
        Button load = (Button) findViewById(R.id.load);
        //为button添加监听时间
        load.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                progressDialog.show();
                //下载图片
                DownLoadImage.loadImage(imageUrl, new DownLoadImage.ImageCallBack() {
                    /**
                     * 实现ImageCallBack的getBitmap()方法
                     * 图片下载完成后,回调该方法
                     * @param bitmap  回调该方法时传入的bitmap,即下载完成后的照片
                     */
                    @Override
                    public void getBitmap(Bitmap bitmap) {
                        progressDialog.dismiss();
                        iv.setImageBitmap(bitmap);
                    }
                });
            }
        });
    }

}
MainActivity的布局文件activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <Button
        android:id="@+id/load"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="下载图片"
        android:textSize="20sp"
        android:layout_margin="10dip" />

    <ImageView
        android:id="@+id/iv"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_below="@id/load"
        android:layout_margin="10dip" />
</RelativeLayout>

就那么几个文件,我就不上传源码了,想要源码的留言。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值