• Handler的总结


    Handler的总结

    我们创建的Service。Activity,Broadcast均是一个主线程处理,即UI线程,

    但是进行耗时操作时,比如I/O读写的大文件,数据库操作及网络下载需要很长的时间,为了不阻塞用户界面,出现ANR的响应提示窗口,我们可以考虑使用Thread线程来解决

    1.对于线程中的刷新一个view为基类的界面,可以使用postInvalidate()方法在线程中处理,其中还提供了一些重写方法比如postInvalidate(int left,int

     top,int right,int bottom)来刷新一个举行区域,及延迟操作,比如postInvalidateDelayed(long delayMiliseconds)或postInvalidateDelayed(long delayMiliseconds,int left,int top,int right,int bottom)方法,其中第一个参数为毫秒。

    2.推荐用一个Handler来处理这些,可以在一个线程的run()方法中调用handler对象的一个postMessage或sendMessage方法来实现,Android程序内部维护着一个消息队列,会轮流处理这些,

    3.Looper:其实Android中每一个Thread都跟着一个Looper,Looper可以帮助Thread维护一个消息队列,但是Looper和Handler没有什么关系,我们从开源代码可以看到Android还提供了一个Thread继承类HandlerThread可以帮助我们处理,在HandlerThread对象中可以通过getLooper来获取Looper对象控制句柄,我们可以将这个Looper对象映射到一个Handler中去实现一个线程的同步机制,Looper对象执行需要初始化looper.perpare方法,同时还要释放资源,使用Looper.release方法。

    4.Massage:对于Android中Handler可以传递一些内容,通过Bundle对象可以封装String,Integer和Blob二进制对象,我们通过在线程中使用Handler对吸纳高的sendEmptyMessage或sendMessage方法来传递一个Bundle对象到handle处理器,对于Handler类提供了重写方法handlerMessage(Message msg)来判断,通过msg。what来区分每条信息。将Bundle解包来实现Handler类更新UI线程中的内容实现控件的刷新操作。相关的Handler对象有关消息发送sendXXX相关方法如下,同时还要postXXXX相关方法,一个为发送后直接返回,一个为处理后才返回。

    5.在Android中还提供了一个Task及AsyncTask处理方式

    6.线程:

    new Thread(

           new Runabler(){

          public void run(){

            view.invalidate();

                }

              }

    ).start();

    7.Thread+handler:

    Handler myHandler=new Handler(){

        public void handleMessage(Message msg){

          switch(msg.what){

            case TestHadler.GUIUPDATEIDENTUFIER:

                view.invalidate();

                }

          }

            super.handlerMessgae(msg);

    };

    class myThread implement Runable{

      public void run(){

        while(!Thread.currentThread().isInterrupted() ){

            Message messgae=new Message();

            message.what=TestHandler.GUIUPDATEIDENTUFIER;

            TestHandler.this.myHandler.sentMessage(message);

              try( Thread.sleep(100); ){

              catch(){}          

                          }

                                }

          }

    }

    8.TimerTask+Handler:

    public class TestTimer extends Activity(){

        Timer timer=new Timer();

        Handler handler=new Handler(){

          public void handleMessage(Message msg){

            switch(msg.what){

            case 1:  setTitle("123");

                break;

                }

              super.handleMessage(msg);

                    }

        };

        TimerTask task=new TimerTask(){

        public void run(){

            Message msg=new Message();

            msg.what=1;

            handler.senMessage(msg);  

              }

        };

        public void onCreate(Bundle savedInstanceState){

          super.onCreate(savedInsanceState);

          setContenView(R.layout.main);

           timer.schedule(task,10000);

        }

    }

    9.Runable+Handler.postDelayed(runable,time)  :在Android里定时更新UI,通常使用的时java.util.Timer ,java.util.TimerTask ,android.os.Handler 组合,实际上Handler自身已经提供了定时的功能。

      privae Handler handler=new Handler();

      priavte Runable myRunable=new Runable(){

        public void run(){

          if(run){

            handler.postDelayed(this,1000);

              count++;

               }

              tvCounter.setText("count:"+count):

          }

      };

    然后再其他地方调用:

    handler.post(myRunable);

    handler.post(myRunable,time);

    案例看:http://shaobin0604.javaeye.com/blog/515820

    你必须非常努力,才能看起来毫不费力。。。
  • 相关阅读:
    微软并行编程类库Parallel Extensions初探 Part1 (转)
    一些很酷的.Net技巧(上)
    【Silverlight】Silvelright端获取托管web项目中xap的路劲
    【Silverlight】Silvelright获取web端的xml
    博客开始第一天
    asp.net过滤HTML方法
    程序员应该懂的道理
    生成缩略图
    转:用自定义IHttpModule实现URL重写
    android 之helloword
  • 原文地址:https://www.cnblogs.com/yiweiaimeng/p/4925275.html
Copyright © 2020-2023  润新知