Andriod全盘扫描指定文件并动态显示到列表上
来源:互联网 发布:淘宝高仿货上架技巧 编辑:程序博客网 时间:2024/06/05 07:35
这两天做的一个炒菜机的项目,其中有个需求是要从本地导入菜单。其实这个菜单就是个txt文件.
那么,需求就来了,我需要把本机的txt文件都扫描出来,并且动态的显示到列表上,再对选择的txt文件进行筛选,判断是不是菜单,是的话,存到本地的数据库。
好了,基本的步骤就出来了。
下面,我们来实现一下扫描并动态显示到列表上。所谓的动态显示就是我每扫描出一个txt就添加到列表上。类似于这样。
如上图所示,需要注意以下几点:
1)扫描是耗时操作,要放到子线程中执行,在主线程中去更新ui
2)我们可以通过监听扫描线程的状态来判断扫描是否完成。
3)扫描完成后注意要及时释放取消定时任务
项目中用了两个开源库
BaseRecyclerViewAdapterHelper
butterknife
下面我们来看看代码:
首先记得要给权限
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
package com.yzq.scanlocaldemo;import android.os.Bundle;import android.os.Environment;import android.support.v7.app.AppCompatActivity;import android.support.v7.widget.AppCompatTextView;import android.support.v7.widget.LinearLayoutManager;import android.support.v7.widget.RecyclerView;import android.support.v7.widget.Toolbar;import android.util.Log;import android.view.View;import android.widget.ProgressBar;import java.io.File;import java.lang.ref.SoftReference;import java.util.ArrayList;import java.util.List;import java.util.Timer;import java.util.TimerTask;import butterknife.BindView;import butterknife.ButterKnife;public class MainActivity extends AppCompatActivity { @BindView(R.id.toolbar) Toolbar toolbar; @BindView(R.id.scanTv) AppCompatTextView scanTv; @BindView(R.id.scanProgressbar) ProgressBar scanProgressbar; @BindView(R.id.recy) RecyclerView recy; private ArrayList<File> scanedFiles = new ArrayList<>(); /*扫描线程*/ private Thread scanThread; /*定时器 用于定时检测扫描线程的状态*/ private Timer scanTimer; /*检测扫描线程的任务*/ private TimerTask scanTask; private FileAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(this); initWidget(); startScan(); } /*初始化控件*/ private void initWidget() { recy.setLayoutManager(new LinearLayoutManager(this)); toolbar.setTitle("扫描文件"); setSupportActionBar(toolbar); getSupportActionBar().setDisplayHomeAsUpEnabled(true); adapter = new FileAdapter(R.layout.scan_file_list_item, scanedFiles); recy.setAdapter(adapter); } /*开始扫描*/ private void startScan() { /*根目录*/ final String rootPath = Environment.getExternalStorageDirectory().getAbsolutePath(); /*要扫描的文件后缀名*/ final String endFilter = ".txt"; final File dir = new File(rootPath); scanThread = new Thread(new Runnable() { @Override public void run() { scanFile(dir, endFilter); } }); /*判断扫描是否完成 其实就是个定时任务 时间可以自己设置 每2s获取一下扫描线程的状态 如果线程状态为结束就说明扫描完成*/ scanTimer = new Timer(); scanTask = new TimerTask() { @Override public void run() { Log.i("线程状态",scanThread.getState().toString()); if (scanThread.getState() == Thread.State.TERMINATED) { /*说明扫描线程结束 扫描完成 更新ui*/ runOnUiThread(new Runnable() { @Override public void run() { Log.i("线程结束","扫描完成"); scanTv.setText("扫描完成,共扫描出" + scanedFiles.size() + "个txt文件"); scanProgressbar.setVisibility(View.GONE); cancelTask(); } }); } } }; scanTimer.schedule(scanTask, 0,1000); /*开始扫描*/ scanThread.start(); } /*扫描*/ private void scanFile(File dir, String endFilter) { File[] files = dir.listFiles(); if (files != null && files.length > 0) { for (final File file : files) { if (file.getName().toUpperCase().endsWith(endFilter.toUpperCase())) { /*是符合后缀名的文件 添加到列表中*/ runOnUiThread(new Runnable() { @Override public void run() { /*刷新界面 要在主线程运行*/ adapter.addData(file); scanTv.setText("已扫描出" + scanedFiles.size() + "个txt文件"); } }); } /*是目录*/ if (file.isDirectory()) { /*递归扫描*/ scanFile(file, endFilter); } } } } @Override protected void onDestroy() { super.onDestroy(); cancelTask(); } private void cancelTask() { Log.i("cancelTask","结束任务"); if (scanTask!=null){ scanTask.cancel(); } if (scanTimer!=null){ scanTimer.purge(); scanTimer.cancel();; } }}
ok,大功告成。下面是demo,希望能对你有帮助。
demo
阅读全文
0 0
- Andriod全盘扫描指定文件并动态显示到列表上
- unity3D 扫描全盘获取文件路径
- C#动态扫描指定目录文件
- win32 汇编实现全盘文件扫描功能(杀毒程序的扫描全盘文件功能)
- 用 AutoHotkey 做一个文件查找工具之三:获取文件列表到数组中并在虚拟列表上显示
- 拖动文件到窗体上,并显示文件路径
- Android开发之扫描附近wifi热点并列表显示
- 上传图片到指定位置并显示
- Qt文件操作:遍历文件夹中 指定格式的文件,并添加文件名到comboBox上
- index 与全盘扫描
- 输出系统的属性到指定文件中并在控制台上显示
- 使用PDF.js在网页显示pdf文件并跳转到指定页码
- 安卓移动文件(图片)到指定目录,并在相册中显示
- 百度地图定位到指定点,并显示指定图标
- mfc打开并显示指定文件
- 读取指定行数文件内容并显示
- 批处理怎样全盘获取指定文件第一个路径?
- 打开文件夹并定位到指定文件
- hadoop入门简介
- 设计模式读书笔记-----外观模式
- Vue——自定义指令directive
- 梯度下降算法
- 梁胜博士亲解Rancher 2.0:K8s之上的Rancher魔法
- Andriod全盘扫描指定文件并动态显示到列表上
- Apache FTPServer本地部署FTP服务
- ububtu 16.04 一些配置
- sql优化:Exists、IN的取舍
- 第2次课改善深层神经网络:超参数优化、正则化以及优化
- 删除文件夹下的所有文件
- 面向对象设计-----属性类型 读取属性特性
- win32 dll中使用cstring
- 乐视云 API