Android 接口函数回调(callback)的基础使用方法与理解【回调】的具体实现

工作内容:
1.接口函数回调用于加载搜索文件信息
学习分享:
使用接口函数回调的地方:FileManager类的Search()方法
共涉及类:
FileManageActivity //文件管理页面

FileManager//文件管理类——处理

FileSearchListener//文件搜索接口

三者之间的调用关系://回调关系

1.在FileManageActivity定义FileManager的对象fileManager

2.并使用fileManager调用FileManager中的setOnFileSearchListener(FileSearchListener fileSearchListener)方法,将在FileManageActivity中的一个实现类的对象fileSearchListener传递给FileManager。

3.在FileManageActivity中使用fileManager调用FileManager的search方法。

search方法中:使用fileSearchListener调用FileSearchListener中的方法 → 调用的是在FileManageActivity中的实现类中的方法


实例:

public interface FileSearchListener {
//    @param type 搜索类型/区域(内置存储/外置存储)
//    @param size 搜索到的文件的大小(累加得来)
//    @param path 正在搜索的文件路径
    void searchBefore(int type);
    void searching(long size,String path);
    void searchAfter(int type);
}

import android.os.Environment;
import android.util.Log;
import java.io.File;

/**
 * Created by Administrator on 2016/8/26.
 */
public class FileManager {
    private long size = 0;      //记录遍历到的文件的总大小
    private String pathString = "";   //记录当前正在扫描的文件路径
    private FileSearchListener fileSearchListener;
    public void setOnFileSearchListener(FileSearchListener fileSearchListener){
        this.fileSearchListener = fileSearchListener;
    }

    /**
     * 调用searchBefore方法(使用的是setOnFileSearchListener中传递进来的实现类的方法)
     * @param type
     */
    public void search(int type){
        Log.d("Testing","搜索前"); //测试
        fileSearchListener.searchBefore(type);
        Log.d("Testing", "开始搜索...");    //测试
        if(type == 1){
            //类型参数是1则传递“内置存储卡”的跟目录进去
            File file = new File(Environment.getExternalStorageDirectory().getPath());
            doSearch(file);
        }
        if(type == 2){
            //类型参数是1则传递“外置存储卡”的跟目录进去
        }
        fileSearchListener.searchAfter(type);
        Log.d("Testing", "搜索后(搜索完成)");  //测试
    }
    private void doSearch(File file) {
        if(file.exists()){
            pathString = file.getPath();
            if (file.isFile()){
                //判断是文件
                size += file.length();
                /**
                 * 执行接口的回调方法,会在Activity中看到实现了的方法
                 * 由于是一个递归方法,所有在执行时会执行多次回调方法
                 * 结果:每次扫描到的文件的信息都会传递到Activity中
                 */
                fileSearchListener.searching(size,pathString);
            }else if(file.isDirectory()){
                //判断是文件夹,递归
                File [] files = file.listFiles();
                for (File temp:files) {
                    doSearch(temp);
                }
            }
        }
    }
}

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.TextView;
import com.liu.lightmusic.R;

/**
 * Created by Administrator on 2016/8/26.
 */
public class FileManageActivity extends Activity {
    private TextView tvSize,tvPath;//这两个按钮只是虚拟的
    private long sizeAll;
    private String stringPath;
    private FileManager fileManager = null;
    private Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            tvSize.setText(sizeAll+"");
            tvPath.setText(stringPath);
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initData();
        startSearchFile();
    }
    //去执行搜索
    private void startSearchFile() {
        //执行:搜索内置存储卡
        fileManager.search(1);
    }
    /**
     * 准备好fileManager等下要用的一个FileSearchListener的实现类
     * 并给fileManager添加FileSearchListener监听
     * 执行:将FileSearchListener实现类的对象传递到FileManager类
     *      在FileManager得到这个参数后,就可以执行搜索方法了,
     *      在搜索方法中调用这个实现类中的方法
     */
    private void initData() {
        fileManager = new FileManager();
        FileSearchListener fileSearchListener = new FileSearchListener() {
            @Override
            public void searchBefore(int type) {
                /**
                 * FileManager中调用了此方法,在这里写代码块,
                 *      可以在执行FileManager的search方法时执行
                 */
            }

            @Override
            public void searching(long size, String path) {
                /**
                 * FileManager中的递归方法调用了此方法,在这里写代码块,
                 *    可以在执行递归方法时,多次执行
                 * 执行结果:动态的将扫描到的文件总大小,搜索路径显示在界面中
                 */
                sizeAll = size;
                stringPath = path;
                handler.sendEmptyMessage(0);//测试用就简略写了
            }

            @Override
            public void searchAfter(int type) {
                /**
                 * FileManager中调用了此方法,在这里写代码块,
                 *      可以在执行FileManager的search方法时执行
                 */
            }
        };
        fileManager.setOnFileSearchListener(fileSearchListener);
    }
}


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值