Android入门六(Handler)

概念

  • 更新UI机制,也是消息处理机制;可以发送消息,也可以处理消息.

使用

  • 错误的更新ui例子
package com.example.sujinming.qumiao;

import android.app.Activity;
import android.os.Bundle;
import android.widget.EditText;
import android.widget.TextView;

public class testHandler extends Activity {

    private TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test_handler);

        textView = (TextView)findViewById(R.id.textView);
        new Thread() {
            public void run(){
                try {
                    Thread.sleep(1000);
                    textView.setText("123");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

            }
        }.start();
    }
}

抛出异常

ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

  • 成功更新实例
package com.example.sujinming.qumiao;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.widget.EditText;
import android.widget.TextView;

public class testHandler extends Activity {

    private TextView textView;

    private Handler handler = new Handler();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test_handler);

        textView = (TextView)findViewById(R.id.textView);
        new Thread() {
            public void run(){
                try {
                    Thread.sleep(1000);
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            textView.setText("123");
                        }
                    });
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

            }
        }.start();
    }
}

常用方法

  • handlerPostDelay()
  • handlerMessage()实例
package com.example.sujinming.qumiao;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.TextView;

public class testHandler extends Activity {

    private TextView textView;

    private Handler handler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            textView.setText(""+msg.arg1);
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test_handler);

        textView = (TextView)findViewById(R.id.textView);
        new Thread() {
            public void run(){
                try {
                    Thread.sleep(2000);
                    Message message = new Message();
                    message.arg1 = 88;
                    handler.sendMessage(message);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }.start();
    }
}

注:(1)除了使用arg1,arg2参数外,还可以使用obj作为参数传送

(2)也可以使用handler.obtainMessage()获得Message对象;也可以不使用handler发送消息,而使用message.sendToTarget();代替

  • handler.removeCallbacks(runnable);
  • 消息截获
Handler handler = new Handler(new Callback(){
        public boolean handlerMessage(Message msg) {
        //截获handler发送的消息,如果设置为true,之后的handlermessage就部执行了
        return false;
        }
    }) {
    public void handlerMessage(Message msg) {

    }
}

使用handler更新ui的原因

  • 解决多线程的并发问题.
  • 举例:多个线程更新ui,并且没有加锁机制,则会造成界面混乱.如果进行加锁,则会导致性能下降.因此android 提供了handler,不用取关心多线程问题,所有的更新ui的操作都是在主线程的消息队列中轮询处理的.

与线程相关的Handler

  • 实例
class MyThread extends Thread{
    public Handler handler;
    public Looper looper;
    public void run(){
        Looper.prepare();
        looper = Looper.myLooper();
        handler = new Handler(){
            public void handleMessage(msg) {

            } 
        }
    } 
    Looper.loop();
}
  • 使用HandlerThread避免handler的空指针问题,解决多线程并发问题

主线程给子线程发送消息

更新ui的方法

  • runOnUiThread
  • handler.post
  • handler.sendMessage
  • view post

非UI线程更新ui的情况

  • viewRootImp在activity的onResume()中进行创建
  • 因为[检查更新UI是否在主线程中]的ViewRootImpl对象是在Activity的onResume方法中被创建出来的.所在在onCreate中起一个线程来更新UI可能会正常运行的 
ps

推荐一篇关于handler的博客handler
看到这里,android的基本知识已经差不多了,终于可以继续写我的应用了,加油,
趣喵

Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值