android之Handler的使用,回到主线程更新UI的四种方法

 new Thread(new Runnable() {
        @Override
        public void run() {
            /*
            * handler使用步骤
            *gei threadLocal设置了一个looper对象
            * 在looper的构造方法中,创建了一个messageQueue对象
            * */
            Looper.prepare();

            /*在构造方法中获取looper和looper中的messageQueue
            *
            * */
            Handler handler=new Handler(){
                @Override
                public void handleMessage(Message msg) {
                    super.handleMessage(msg);

                }
            };

            /*奖message发送到messagequeue中,在messageQueue里面,所有的message都是时间为顺序从小到大排列
            *
            * */
handler.sendEmptyMessage(0);
/*
*顺序取出messageQueue中的message
*并且执行message。target。dispatchMessage();其中的message。target就是发送这个消息的handler
* 每一条消息都有一定的执行时间,handler会判断时间有没有到,如果没到时间会等待,
* */
Looper.loop();
        }
    }).start();


----------handler的使用------

通过Message与Handler进行通信的步骤是: 
1. 重写Handler的handleMessage方法,根据Message的what值进行不同的处理操作 
2. 创建Message对象 
虽然Message的构造函数式public的,我们还可以通过Message.obtain()或Handler.obtainMessage()来获得一个Message对象(Handler.obtainMessage()内部其实调用了Message.obtain())。 
3. 设置Message的what值 
Message.what是我们自定义的一个Message的识别码,以便于在Handler的handleMessage方法中根据what识别出不同的Message,以便我们做出不同的处理操作。 
4. 设置Message的所携带的数据,简单数据可以通过两个int类型的field arg1和arg2来赋值,并可以在handleMessage中读取。 
5. 如果Message需要携带复杂的数据,那么可以设置Message的obj字段,obj是Object类型,可以赋予任意类型的数据。或者可以通过调用Message的setData方法赋值Bundle类型的数据,可以通过getData方法获取该Bundle数据。 
6. 我们通过Handler.sendMessage(Message)方法将Message传入Handler中让其在handleMessage中对其进行处理。 

需要说明的是,如果在handleMessage中 不需要判断Message类型,那么就无须设置Message的what值;而且让Message携带数据也不是必须的,只有在需要的时候才需要让其携带数据;如果确实需要让Message携带数据,应该尽量使用arg1或arg2或两者,能用arg1和arg2解决的话就不要用obj,因为用arg1和arg2更高效。

Handler handler = new Handler()
{
    public void handleMessage(android.os.Message msg) {
        switch (msg.what){
            case 1:
                String str= (String) msg.obj;
                reponsedattx.setText(str);
                break;


        }
    };
};

//get同步请求---http://ddb.cn/api/VlianbaoCash/deposit
    public void gettongbuDatasync(){
        new Thread(new Runnable() {
            @Override
            public void run() {
                OkHttpClient client = new OkHttpClient();//创建OkHttpClient对象
                Request request = new Request.Builder()
                        .url(String.valueOf(test.getText()))//请求接口。如果需要传参拼接到接口后面。
                        .build();//创建Request 对象
                Response    response=null;
                try {
                     response = client.newCall(request).execute();//得到Response 对象
                    Log.e("kwwl","get同步res=="+response.body().string());
                  String resstr=response.body().string();

                    Message msg=new Message();
                    //虽然Message的构造函数式public的,我们也可以通过以下两种方式通过循环对象获取Message
                    //msg = Message.obtain(uiHandler);
                    //msg = uiHandler.obtainMessage();

                    //what是我们自定义的一个Message的识别码,以便于在Handler的handleMessage方法中根据what识别
                    //出不同的Message,以便我们做出不同的处理操作
                    msg.what = 1;

                    //我们可以通过arg1和arg2给Message传入简单的数据

                    msg.arg2 = 321;
                    msg.obj="jjjj";
                    //我们也可以通过给obj赋值Object类型传递向Message传入任意数据
                    //msg.obj = null;
                    //我们还可以通过setData方法和getData方法向Message中写入和读取Bundle类型的数据
                    //msg.setData(null);
                    //Bundle data = msg.getData();

                    //将该Message发送给对应的Handler
                    handler.sendMessage(msg);

                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }


-------回到主线程更新UI的四种方法,参考:https://blog.csdn.net/mislaydu/article/details/51776247



你可能感兴趣的:(android)