美文网首页Android开发技术异步加载
Android 异步加载数据方式整理

Android 异步加载数据方式整理

作者: 王少星 | 来源:发表于2015-11-22 10:03 被阅读1398次

在 Android 中,由于主线程负责维护 UI,不能被阻塞,那么在通过磁盘或者网络进行异步加载数据的时候就需要使用多线程了。以下是我整理的几种使用多线程执行异步操作的方式,如有纰漏欢迎指正。

  1. Handler

    Android 中多线程通信基本的方式是使用 Handler 机制,基本使用方式如下。

    //init handler on the original thread
    class OriginalThread extends Thread {
     public Handler mHandler;
     public void run() {
       Looper.prepare();
       mHandler = new Handler() {
         public void handleMessage(Message msg) {
             // process incoming messages here
         }
       };
       Looper.loop();
     }
    }
    //send message to the original thread
    mHandler.post(Runnable);
    mHandler.postAtTime(Runnable, long);
    mHandler.postDelayed(Runnable, long);
    mHandler.sendEmptyMessage(int);
    mHandler.sendMessage(Message);
    mHandler.sendMessageAtTime(Message, long);
    mHandler.sendMessageDelayed(Message, long);
    

    系统还内置了AsyncQueryHandler 辅助子类,方便使用 ContentResolver 进行异步查询操作。

    关于 Handler,需要注意的是,当 Handler 被声明为 Activity 的非静态内部类时, Handler 会持有外部 Activity 实例的引用,Handler 生命周期比 Activity 长时会导致 Activity 实例不能被正常释放,从而引起内存泄漏。一种解决方式是将 Handler 声明为 Activity 的静态内部类或者单独的类,在 Handler 内部使用 WeakReference/SoftReference 保存对 Activity的引用,既能访问 Activity 的 View 更新 UI,又可以避免内存泄漏。

  2. AsyncTask

    AsyncTask 方式是官方提供的用来简化手动写 Handler 的一种异步机制,其内部仍使用 Handler 实现。

    需要继承AsyncTask<Params, Progress, Result>类,重写doInBackground,onPostExecute等回调方法,使用的时候调用 execute 方法(只能在 UI 线程调用)传入参数就可以方便的执行 IO 或网络等耗时操作并在操作完成时更新 UI。

    使用 AsyncTask 同样需要注意内存泄漏问题。

  3. Activity.runOnUiThread(Runnable action)

    算是 Handler 方式的一种语法糖吧,使用了 Activity 自身维护的 一个 mHandler 实例,便于在 UI 线程执行操作,比如异步获取数据后更新 UI。

  4. Loader

    Loader 是在 Android 3.0 引入的用于在 Activity 和 Fragment 中简化异步加载数据的方式。

    系统提供了 AsyncTaskLoader<D> 和 CursorLoader 两个子类。

  5. View.post(Runnable action)/View.postDelayed(Runnable action, long delayMillis)

  6. RxJava

    使用 RxJava 可以方便地进行多线程调度,通过调用 Observable.subscribeOn 和 Observable.observeOn,并使用 Schedulers.io() 和 Schedulers.mainThread() 等工厂方法传入参数即可自由切换线程。

  7. EventBus

    使用 EventBus 可以在任意线程发布数据,并通过订阅方法的命名约定规定在何种线程执行订阅的回调方法。

    // Called in the same thread (default)
    public void onEvent(MessageEvent event) {
     log(event.message);
    }
    // Called in Android UI's main thread
    public void onEventMainThread(MessageEvent event) {
     textField.setText(event.message);
    }
    // Called in the background thread
    public void onEventBackgroundThread(MessageEvent event){
     saveToDisk(event.message);
    }
    // Called in a separate thread
    public void onEventAsync(MessageEvent event){
     backend.send(event.message);
    }
    

相关文章

  • Android 异步加载数据方式整理

    在 Android 中,由于主线程负责维护 UI,不能被阻塞,那么在通过磁盘或者网络进行异步加载数据的时候就需要使...

  • Flutter 21: 图解 ListView 下拉刷新与上拉加

    小菜前段时间整理了两种 ListView 的异步加载数据时,下拉刷新与上滑加载更多的方式,每种方式都有自己的优势,...

  • Android知识点回顾之Loader

    Loader是谷歌在Android 3.0引入的异步加载机制,能够对数据异步加载并显示到Activity或Frag...

  • Loader(加载器)的使用

    加载器: Android 3.0 中引入了加载器,支持轻松在Activity或者片段中异步加载数据。 加载器的特征...

  • 加载器

    Android 3.0 中引入了加载器,支持轻松在 Activity 或片段中异步加载数据。 加载器具有以下特征:...

  • 爬取拉勾网

    拉勾网数据加载的方式使用的是ajax异步加载的方式从后端加载数据,所以就需要分析加载的URL,如果有疑问可以看我的...

  • 2018-03-29

    Android LoaderManager异步数据加载读取手机存储中的音乐文件。 ··· package com....

  • Android进阶——自定义Loader以一种更优美的方式异步加

    引言 前一篇文章中Android进阶——借助Loader机制以一种更优美的方式异步加载数据(一)概述了Loader...

  • Loader源码分析

    Android 3.0 中引入了加载器,支持轻松在 Activity 或片段中异步加载数据。 我们今天就来八一八里...

  • UITableView 复用时出现错乱问题

    列表通过网络加载数据的时候,不要将网络异步加载数据直接给列表项赋值。 原来做android项目开发的时候,在列表通...

网友评论

    本文标题:Android 异步加载数据方式整理

    本文链接:https://www.haomeiwen.com/subject/wcfrhttx.html