使用消息机制原理列出所有的文件

来源:互联网 发布:阿里云学生机预装环境 编辑:程序博客网 时间:2024/06/06 17:22

消息机制这个玩意儿,理解起来还是有点费劲的。要理解清楚的话需要对线程有很好的理解,出此之外还要掌握好消息机制的用法。这里我用的是Android里的一个工具类叫AsyncTask,这个类使用泛型指定了3个参数。第一个参数是启动任务需要的参数类型,第二个参数表示后台执行任务的百分比,第三个参数表示任务完成之后返回的信息。下面就一步一步的做这个小例子。

1.主界面准备一个ListView来显示文件信息,辅助界面是信息的主体如下所示

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="vertical"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    >    <ListView    android:id="@+id/list"    android:layout_width="fill_parent"     android:layout_height="wrap_content"     /></LinearLayout>

下面是辅助界面

<?xml version="1.0" encoding="utf-8"?><TableLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="vertical"    android:layout_width="fill_parent"    android:layout_height="wrap_content"    >   <TableRow>     <ImageView       android:id="@+id/img"       android:layout_width="wrap_content"        android:layout_height="wrap_content"      />      <TextView        android:id="@+id/name"        android:layout_width="wrap_content"         android:layout_height="wrap_content"      />   </TableRow></TableLayout>

2.下面先来这个比较复杂的类,这个类继承AsyncTask

 private class ListFileTools extends AsyncTask<File, File, String>{        @Overrideprotected void onProgressUpdate(File... values) {    Map<String,Object> fileItem=new HashMap<String, Object>();    //如果为目录    if(values[0].isDirectory()){    fileItem.put("img", R.drawable.folder_close);    }else{    fileItem.put("img", R.drawable.file);    }    fileItem.put("name", values[0]);    ListActivity.this.allFileItems.add(fileItem);    //包装数据    ListActivity.this.simple=new SimpleAdapter(ListActivity.this,     allFileItems, R.layout.file_list, new String[]{"img","name"}, new int[]{R.id.img,R.id.name});    ListActivity.this.fileList.setAdapter(ListActivity.this.simple);       }@Overrideprotected String doInBackground(File... params) {if(!params[0].getPath().equals(java.io.File.separator)){ Map<String,Object> fileItem=new HashMap<String, Object>(); fileItem.put("img", R.drawable.folder_open); fileItem.put("name", params[0].getParentFile()); ListActivity.this.allFileItems.add(fileItem);}if(params[0].isDirectory()){File tempFile[]=params[0].listFiles();if(tempFile!=null){for(int i=0;i<tempFile.length;i++){this.publishProgress(tempFile[i]);}}}return "文件已经列出";}        }

这里代码不是很复杂关键在于理解,我们执行后台任务的时候传递的是文件对象,更新主界面UI返回的是File类型,返回的信息则是string类型。

3.activity载入的时候我们需要执行后台任务,列出一级文件夹和文件,listview被点击时也执行这个任务列出子文件夹的信息

 private List<Map<String,Object>> allFileItems=new ArrayList<Map<String,Object>>();    private SimpleAdapter simple=null;    private ListView fileList=null;    private ListFileTools tools=null;    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        this.fileList=(ListView)super.findViewById(R.id.list);        //从根目录列出所有文件        File filePath=new File(java.io.File.separator);        //定义子任务        tools=new ListFileTools();        tools.execute(filePath);        this.fileList.setOnItemClickListener(new OnItemClickListener() {public void onItemClick(AdapterView<?> parent, View view,int position, long id) {File currentFile=(File)ListActivity.this.allFileItems.get(position).get("name");if(currentFile.isDirectory()){ListActivity.this.allFileItems=new ArrayList<Map<String,Object>>();ListFileTools tool=new ListFileTools();tool.execute(currentFile);}}});    }

代码看起来有点多,但是这的确是个很好的例子,下面来看看效果图



原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 狗狗牙齿松动了怎么办 狗狗牙齿掉了怎么办 眼镜金属架断了怎么办 纯钛眼镜架断了怎么办 万次火柴没油了怎么办 火疖子破了流脓怎么办 火疖子没有脓头怎么办 孕妇长火疖子疼怎么办 手上长小水泡痒怎么办 脚上起水泡很痒怎么办 手指上有水泡痒怎么办 手指起小水泡痒怎么办 手过敏起小水泡怎么办 头皮上白色像癣怎么办 脸上长了火疖子怎么办 脸上长硬硬的包怎么办 下身体痒痒得不得了怎么办 头皮干痒头屑多怎么办 头发掉的露头皮怎么办 头上老是有结痂怎么办 婴儿头上的黄痂怎么办 头皮屑多又痒怎么办小偏方 皮肤瘙痒起红疙瘩怎么办 头又油又痒怎么办 头上反复长脓包怎么办 额头上长了粉刺怎么办 身上长红疙瘩很痒怎么办 脸上的痘痘变硬怎么办 痘痘变成硬疙瘩怎么办 痘痘变硬了怎么办知乎 痘痘里面是硬的怎么办 皮肤出油毛孔大怎么办 蹭无线网信号差怎么办 无线网离得太远怎么办 无线网不好使了怎么办 火疖子化脓破了怎么办 脸上长了个疖子怎么办 脸上起了火疖子怎么办 脸上长了火疙瘩怎么办 脸上长疖子了该怎么办? 头上神经线疼怎么办