Android后台线程

Android后台线程,第1张

概述我正在制作图像处理器应用程序.我需要扫描手机中的图片,并列出其像素数.因此,这将对性能产生重大影响,据我了解,我需要使其在后台线程上运行.所以我的问题是,什么是最好的方法?我知道IntentService可能是最好的解决方案,但是我不确定如何使用它实现进度条,因此我需要返回Picture对

我正在制作图像处理器应用程序.我需要扫描手机中的图片,并列出其像素数.因此,这将对性能产生重大影响,据我了解,我需要使其在后台线程上运行.

所以我的问题是,什么是最好的方法?我知道IntentService可能是最好的解决方案,但是我不确定如何使用它实现进度条,因此我需要返回Picture对象,然后在shuffle按钮上更新UI.我正在使用GlIDe库进行更新,以便顺利进行.

在阅读有关Asynctasks的文章时,我迷迷糊糊地评论了它的糟糕之处,并导致内存泄漏,应避免使用它.目前,rXJava太复杂了.
 这是我的代码:

主要活动:

@OnClick(R.ID.shuffle)public voID shuffleList() {    Collections.shuffle(listofImagefiles);    recyclerVIEwAdapter = new PictureRecycleVIEwAdapter(listofImagefiles, this);    recyclerVIEw.swapAdapter(recyclerVIEwAdapter, false);    recyclerVIEwAdapter.notifyDataSetChanged();}@OnClick(R.ID.scan)public voID processImages() {    //progress bar    listofPictures = new ArrayList<>();    //Gets data from default camera roll directory. Note that some of the phone companIEs have different file paths. So instead of hardCoding string paths, I used this instead.    String path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).getPath();    file filePath = new file(path);    listofImagefiles = scanPhotos(filePath);    // async?    for (file file : listofImagefiles            ) {        Bitmap bitmap = BitmapFactory.decodefile(file.getPath());        //int is sufficIEnt for most today's pixels. long would be overkill - 4 vs 8 bytes        int pixels = bitmap.getHeight() * bitmap.getWIDth();        listofPictures.add(new Picture(file.getPath(), pixels));    }}public List<file> scanPhotos(file directory) {    List<file> listofPictures = new ArrayList<>();    try {        file[] files = directory.Listfiles();        for (file file : files                ) {            if (file.isDirectory() && !file.isHIDden()) {                listofPictures.addAll(scanPhotos(file));            } else {                if (file.getname().endsWith(".jpg") || file.getname().endsWith(".jpeg") || file.getname().endsWith(".png")) {                    listofPictures.add(file);                }            }        }    } catch (Exception e) {        Log.e(e.getMessage(), e.getMessage());    }    return listofPictures;}

解决方法:

意图服务

IntentService绝对是一种有效的方法.您可以使用广播将结果返回到应用程序的另一个组件,例如“活动”或另一个“服务”,例如:

>启动IntentService-如果需要一些参数,请将它们放在服务意图的Extras中.
>您的IntentService在后台线程上运行,直到计算完成.
>完成后,发送广播,并将计算结果放入意向附加中.
>在您的活动中,注册一个broadcastReceiver,它将监听您的计算结果广播.
>在活动中广播后,从意向附加中检索计算结果.

您也可以实施服务接收的广播,例如取消计算或更新参数.

IntentService的优点之一是,您可以轻松地将其与JobScheduler API集成在一起,以将执行推迟到满足某些系统条件为止.

备择方案

>您可以使用总线库(例如https://github.com/greenrobot/EventBus)在Activity和Service之间进行通信-唯一的问题是EventBus无法与远程服务一起使用(在单独的进程中运行).
>就像您提到的,将RxJava与IO和计算调度程序一起使用也是一个好主意.
> AsyncTask很好,只要您不对活动进行硬引用即可-不要将其实现为Activity的内部类,并且如果您想将结果传达回去,请通过WeakReference< T>

总结

以上是内存溢出为你收集整理的Android后台线程全部内容,希望文章能够帮你解决Android后台线程所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1091097.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存