«

Android中的回调机制

时间:2024-3-2 17:34     作者:韩俊     分类: 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 = "http://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>

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

标签: android

热门推荐