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