Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

com.github.gzuliyujiang.filepicker.FileExplorer显示有点卡顿 #293

Closed
Reginer opened this issue Mar 11, 2022 · 14 comments
Closed

com.github.gzuliyujiang.filepicker.FileExplorer显示有点卡顿 #293

Reginer opened this issue Mar 11, 2022 · 14 comments

Comments

@Reginer
Copy link

Reginer commented Mar 11, 2022

可否改成异步加载?有这个控件的页面启动速度会变慢

@liyujiang-gzu
Copy link
Member

用的是直接同步读取文件目录及文件列表,若某个目录下文件过多,肯定是偶遇影响速度的。异步加载是需要改下源代码FileAdapter#loadData(String initDir)
微信截图_20220316104827

@Reginer
Copy link
Author

Reginer commented Mar 16, 2022

嗯是的,有打算更新的话可否把这个一起更新上去

@liyujiang-gzu
Copy link
Member

嗯是的,有打算更新的话可否把这个一起更新上去

正在尝试修改中

@liyujiang-gzu
Copy link
Member

@Reginer 使用这个临时版本试试: implementation 'com.github.gzu-liyujiang.AndroidPicker:FilePicker:4621549e35

@Reginer
Copy link
Author

Reginer commented Mar 16, 2022

java.util.NoSuchElementException
	at java.util.LinkedList.getFirst(LinkedList.java:244)
	at com.github.gzuliyujiang.filepicker.adapter.FileAdapter.loadData(FileAdapter.java:297)
	at com.github.gzuliyujiang.filepicker.FileExplorer.refreshCurrent(FileExplorer.java:207)
	at com.github.gzuliyujiang.filepicker.FileExplorer.onPathClicked(FileExplorer.java:137)
	at com.github.gzuliyujiang.filepicker.adapter.PathAdapter$1.onClick(PathAdapter.java:102)

说一下我的操作,是在DialogFragment里显示这个控件的。

第一次显示正常的,DialogFragment.show -> DialogFragment.dismiss

第二次打开就开始异常了,会把本来取消显示的home和back显示出来

多次显示取消之后,点击上面目录快捷位置会崩溃

@liyujiang-gzu liyujiang-gzu reopened this Mar 16, 2022
@liyujiang-gzu
Copy link
Member

NoSuchElementException...LinkedList.getFirst...目测是多线程数据同步问题导致LinkedList.isEmpty判断失效。LinkedList不是线程安全的。

@liyujiang-gzu
Copy link
Member

@Reginer 我demo的场景,用LinkedList和ConcurrentLinkedQueue都没有闪退,我重新换成ConcurrentLinkedQueue实现你再试试: implementation 'com.github.gzu-liyujiang.AndroidPicker:FilePicker:d56b38e068

@Reginer
Copy link
Author

Reginer commented Mar 16, 2022

崩溃没有了,上面流程会复现出来目录显示不全问题,就显示一个文件夹,单击文件夹跳转到了一个错误的文件夹
还会有把本来设置隐藏的home和back显示出来

@liyujiang-gzu
Copy link
Member

liyujiang-gzu commented Mar 16, 2022

崩溃没有了,上面流程会复现出来目录显示不全问题,就显示一个文件夹,单击文件夹跳转到了一个错误的文件夹 还会有把本来设置隐藏的home和back显示出来

默认我改成不异步加载了。通过setInitDir的第三个参数设置true来开启异步加载。
image

我这里使用Thread.sleep()不好模拟出卡顿的场景,你拉取下代码,看看FileAdapter.loadData如何修改,里面用到了ConcurrentLinkedQueue+ExecutorService+FutureTask+Handler来实现队列异步加载,可以的话你改好了提一个Pull Request。

在GitHub仓库提交的代码,都可以通过jitpack.io来构建临时版本:
image

@liyujiang-gzu liyujiang-gzu reopened this Mar 16, 2022
@Reginer
Copy link
Author

Reginer commented Mar 16, 2022

bug复现

修改了几个文件可以复现我说的问题,把这个图片保存下来,后缀名修改为zip,里面有个bug复现.patch文件,合并到现在的源码里就可以复现点那个弹窗浏览就可以复现问题了。

@Reginer
Copy link
Author

Reginer commented Mar 16, 2022

bug复现

修改了几个文件可以复现我说的问题,把这个图片保存下来,后缀名修改为zip,里面有个bug复现.patch文件,合并到现在的源码里就可以复现点那个弹窗浏览就可以复现问题了。

哦,太不幸了,github把图片压缩了,里面压缩包解压不出来了,补丁发到你qq邮箱了

@Reginer
Copy link
Author

Reginer commented Mar 16, 2022

bug做了下修复,修改方法 com.github.gzuliyujiang.filepicker.adapter.FileAdapter#loadData

public void loadData(final File dir) {
        if (!loadAsync) {
            reallyRefresh(loadDataSync(dir));
        } else {
            THREAD_POOL.execute(new Runnable() {
                @Override
                public void run() {
                    final List<FileEntity> temp = loadDataSync(dir);
                    UI_HANDLER.post(new Runnable() {
                        @Override
                        public void run() {
                            reallyRefresh(temp);
                        }
                    });
                }
            });
        }

    }

调用的时候,setInitDir方法最后调用


        fileExplorer.setShowHomeDir(false);
        fileExplorer.setShowUpDir(false);
        fileExplorer.setShowHideDir(false);
        fileExplorer.setInitDir(ExplorerMode.FILE, new File("sdcard"),true);

@liyujiang-gzu
Copy link
Member

你最后改的这个是我最开始的写法,这种写法有一个问题,就是:上一个目录数据还未加载出来就快速切换目录,这样会造成数据刷新混乱。所以我才改成队列的方式……

@liyujiang-gzu
Copy link
Member

@Reginer FileExplorer已重构

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants