zoukankan      html  css  js  c++  java
  • 异步消息处理机制,UI更新

    UI只能在主线程中完成更新,在子线程中更新UI报错如下

    Only the original thread that created a view hierarchy can touch its views.

    但是,在主线程中完成耗时操作容易引起使用体验不佳,进程卡顿问题,为了解决此问题引入异步消息处理机制

    异步消息处理机制

    1. message 携带少量信息的消息,what字段,arg1字段,arg2字段,obj字段(三个整型,一个obj型)

    2. handler 消息管理者,sengMessage()方法和handlerMessage()方法,一个用于发送信息,一个用于接收信息

    3. MessageQueue 消息队列,存放消息,等待被处理

    4. Looper 循环器,MessageQueue的管家,调用looper的loop()方法后,MessageQueue中的消息进去无限循环,将消息传递至handlerMessage中

     

    使用异步消息的步骤

    1. 再主线程中创建handler,并重写handlerMessage()方法
        private Handler mHandler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                switch (msg.what) {
                    case SHOW_RESPONSE:
                        String response = (String) msg.obj;
                        NetworkTextView.setText(response);
                        break;
                }
            }
        };

      2.在子线程中更新UI时,创建Message对象,给Message对象的字段赋值,并把使用Handler.sengMessage()方法,将Message对象发送出去

           Message message = new Message();
           message.what = SHOW_RESPONSE;
           message.obj = response.toString();
           mHandler.sendMessage(message);

      3.在主线程中的handlerMessage接收到Messsge并进行判断,执行操作

    使用AsyncTask更新UI(封装好的异步消息处理机制)

    由于 AsyncTask 是一个抽象类,要创建一个子类去继承它。在继承时我们可以为 AsyncTask 类指定三个泛型参数,这三个参数的用途如下。

    1. Params
      在执行 AsyncTask 时需要传入的参数,可用于在后台任务中使用。
    2. Progress
      后台任务执行时,如果需要在界面上显示当前的进度,则使用这里指定的泛型作为进度单位。
    3. Result
    当任务执行完毕后,如果需要对结果进行返回,则使用这里指定的泛型作为返回值类型。

     

    class DownloadTask extends AsyncTask<Void, Integer, Boolean> {
    ……
    }

    重写 AsyncTask 中的几个方法才能完成对任务的定制。经常需要去重写的方法有以下四个。

    1. onPreExecute()
      这个方法会在后台任务开始执行之前调用,用于进行一些界面上的初始化操作,比如显示一个进度条对话框等。
    2. doInBackground(Params...)
      这个方法中的所有代码都会在子线程中运行,我们应该在这里去处理所有的耗时任务。任务一旦完成就可以通过 return 语句来将任务的执行结果返回,如果 AsyncTask 的第三个泛型参数指定的是 Void,就可以不返回任务执行结果。注意,在这个方法中是不可以进行 UI 操作的,如果需要更新 UI 元素,比如说反馈当前任务的执行进度,可以调用 publishProgress(Progress...)方法来完成。
    3. onProgressUpdate(Progress...)
      当在后台任务中调用了 publishProgress(Progress...)方法后,这个方法就会很快被调用,方法中携带的参数就是在后台任务中传递过来的。在这个方法中可以对 UI 进行操作,利用参数中的数值就可以对界面元素进行相应地更新。
    4. onPostExecute(Result)
      当后台任务执行完毕并通过 return 语句进行返回时,这个方法就很快会被调用。返回的数据会作为参数传递到此方法中,可以利用返回的数据来进行一些 UI 操作,比如说提醒任务执行的结果,以及关闭掉进度条对话框等。

    使用 AsyncTask 的诀窍就是,在 doInBackground()方法中去执行具体的耗时任务,在 onProgressUpdate()方法中进行 UI 操作,在 onPostExecute()方法中执行一些任务的收尾工作

    如果想要启动这个任务,只需编写以下代码即可:

    new DownloadTask().execute(); 



  • 相关阅读:
    JavaScript操作符instanceof揭秘
    Linux打开txt文件乱码的解决方法
    Working copy locked run svn cleanup not work
    poj 2299 UltraQuickSort 归并排序求解逆序对
    poj 2312 Battle City 优先队列+bfs 或 记忆化广搜
    poj2352 stars 树状数组
    poj 2286 The Rotation Game 迭代加深
    hdu 1800 Flying to the Mars
    poj 3038 Children of the Candy Corn bfs dfs
    hdu 1983 Kaitou Kid The Phantom Thief (2) DFS + BFS
  • 原文地址:https://www.cnblogs.com/cenzhongman/p/6395543.html
Copyright © 2011-2022 走看看