Android Handler与多线程

摘要:
StringqueryString=getIntent().getStringExtra(“query”);将上述处理程序和查询词传递到构造函数GetHtmlThreadhread=newGetHtmlThread(handler,//startthread.start());StringqueryKey){this.handler=handler;

本文首先解释一下handler是用来干嘛的,然后通过例子介绍其在多线程中的应用。

什么是Handler

     handler通俗一点讲就是用来在各个进程之间发送数据的处理对象。在任何进程中,只要获得了另一个进程的handler则可以通过 handler.sendMessage(message)方法向那个进程发送数据。基于这个机制,我们在处理多线程的时候可以新建一个thread,这 个thread拥有UI线程中的一个handler。当thread处理完一些耗时的操作后通过传递过来的handler像ui线程发送数据,由UI线程 去更新界面。

handler应用多线程例子

   我们这个例子是实现一个简单的词典功能。在获取网页过程中应用线程。这个程序共有两个activity,第一个用于输入查询的单词,第二个 activity用于显示结果。我们直接看第二个activity的内容。(第一个activity无非是获得用户输入的单词然后传给 activity2,还没有掌握的可以看我前面的文章)

    首先来看OnCreate:

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

        tvResult = (TextView) findViewById(R.id.tvResult);
        String queryString = getIntent().getStringExtra("query");

        Log.d("threadId:", String.valueOf(Thread.currentThread().getId()));

        // 声明一个handler,它的处理程序是实现了callback的类,这里我将这个activity继承了
        // callback,所以可以传入this。
        handler = new Handler(this);
        // 新建一个线程(我们自己实现的线程),将上面的handler和查询的单词传入构造函数
        GetHtmlThread thread = new GetHtmlThread(handler, getIntent()
                .getStringExtra("query"));
        // 开始线程
        thread.start();

        progressBar = (ProgressBar) findViewById(R.id.prb);
        progressBar.setVisibility(View.VISIBLE);
    }

一些必要的注释我已经在代码注明了。代码中的那个GetHtmlThread线程是继承于Thread的一个类,然后自己实现里面的run方法,这个和c#里面不一样。感觉还是c#里面好理解一点。那我们就看看这个GetHtmlThread类:

    public class GetHtmlThread extends Thread
    {

        private Handler handler; // 传入的handler
        String queryKey; // 要查询的单词

        public GetHtmlThread(Handler handler, String queryKey)
        {
            this.handler = handler;
            this.queryKey = queryKey;
        }

        @Override
        public void run() // 线程处理的内容
        {
            // 获得网页中关于这个词的解释,返回的网页内容
            String a = GetTranslateHtml(queryKey);

            // 定义一个消息,用于发给UI线程的handler处理
            Message msg = new Message();
            Bundle bundle = new Bundle();
            // 将查询的结果放进msg中
            bundle.putString("answer", a);
            msg.setData(bundle);
            // 设置这个msg的标识,这样UI中的handler才能根据这个更改对应的UI
            msg.what = 0;
            // 将消息发送给UI中的handler处理
            handler.sendMessage(msg);
            super.run();
        }
    }

 

现在线程中的消息发送出去了。我们再到UI线程中处理这个消息。代码如下:

    /**
     * 继承了callback后,必须要实现这个方法。即上面那个handler的处理都在这里进行
     */
    @Override
    public boolean handleMessage(Message msg)
    {
        // 通过判断msg.what来判断到底是哪个"事件"要进行处理
        switch (msg.what)
        {
            case 0:
                progressBar.setVisibility(View.GONE);
                // 拿出msg中的数据并显示出来
                Bundle bundle = msg.getData();
                tvResult.setText(bundle.getString("answer"));
                break;

            default:
                break;
        }
        return false;
    }

这样我们就可以看到当第二个activity显示一段时间后网页才显示出来,并没有出现卡死的情况!

最后再来梳理下多线程处理的步骤:

1

免责声明:文章转载自《Android Handler与多线程》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇WinRAR(WinZip)压缩与解压实现(C#版Window平台)CP15 协处理器寄存器解读下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Jmeter(八)

 ------------------------------------------------------------------- 转载自:北京-宏哥 https://www.cnblogs.com/du-hong/p/13037317.html ----------------------------------------------------...

学习Android camera笔记 & 调用流程

参考:http://blog.csdn.net/xingyu19871124/article/details/7750189http://blog.csdn.net/BonderWu/article/details/5814278http://blog.chinaunix.net/uid-2630593-id-3307176.htmlhttp://zhid...

UI线程异常处理方法

当应用程序启动,创建了一个叫“main”的线程,用于管理UI相关,又叫UI线程。其他线程叫工作线程(Work Thread)。 Single Thread Model   一个组件的创建并不会新建一个线程,他们的创建都在UI线程中进行,包括他们的回调方法,如onKeyDown()。 当在UI线程中进行某些耗时的操作时,将会阻塞UI线程,一般阻塞超过5秒就...

android中的资源访问

一.android中的资源是在代码中使用的外部文件。图片,音频,动画和字符串等叫做android中的资源文件。 二.Android工程 资源类型布局表    与src源文件夹并列的两个文件夹assets和res用来保存资源文件。      1.assets文件夹中放原声文件如MP3文件,通过AssetManager类以二进制流的形式访问      2.re...

Android Looper详解

在Android下面也有多线程的概念,在C/C++中,子线程可以是一个函数, 一般都是一个带有循环的函数,来处理某些数据,优先线程只是一个复杂的运算过程,所以可能不需要while循环,运算完成,函数结束,线程就销毁。对于那 些需要控制的线程,一般我们都是和互斥锁相互关联,从而来控制线程的进度,一般我们创建子线程,一种线程是很常见的,那就是带有消息循环的线程...

python中的轻量级定时任务调度库:schedule

提到定时任务调度的时候,相信很多人会想到芹菜celery,要么就写个脚本塞到crontab中。不过,一个小的定时脚本,要用celery的话太“重”了。所以,我找到了一个轻量级的定时任务调度的库:schedule。 schedule库是一个轻量级的定时任务方案,优势是使用简单,也不需要做什么配置;缺点是无法动态添加任务,也无法将任务持久化。   库的安装还是...