在主线程中创建新Handler的含义

时间:2015-04-07 18:05:43

标签: android handler

我是Android世界的初学者,我现在正在与一些概念斗争。其中之一是Handler对象。我已经重新研究了这个主题,但我仍然没有完全理解这个主题。我可能会混淆一些概念。 这是我写的一个简单的应用程序,它在屏幕上显示了一个进度条。

    package com.example.mjack.progressbarthread;

import android.os.Handler;
import android.os.Message;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ProgressBar;
import android.widget.TextView;



public class MainActivity extends ActionBarActivity {

    Handler mHandler;
    ProgressBar mProgressBar;
    TextView mTextView;
    Thread myThread;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mProgressBar = (ProgressBar) findViewById(R.id.progressBar);
        mTextView = (TextView) findViewById(R.id.textview);
        mHandler = new Handler() {
            @Override
            public void handleMessage(Message msg) {

                mProgressBar.setProgress(msg.arg1);
                mTextView.setText("Progress....   " + (msg.arg1 +1) + " %");
                if (msg.arg1 == 99)  {

                    mTextView.setText("Done!!!");
                }

            }
        };
        myThread = new Thread(new MyRunnable());
        myThread.start();

    }


    class MyRunnable implements Runnable {


        @Override
        public void run() {

            for (int i = 0; i<100; i++) {

                Message message = mHandler.obtainMessage();
                message.arg1 = i;
                mHandler.sendMessage(message);
                try {
                    myThread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

            }


        }
    }

据我所知,到目前为止(如果我错了,请纠正我): 1.主线程已经连接了一个Looper和Handler,以便能够执行排队任务(不像新线程,我必须准备()一个Looper并实例化一个Handler)。 2.只有一个处理程序可以在特定时间附加到一个线程(直到它被一个新实例化的Handler对象替换)。

我的问题是:如果我在主线程中创建一个新的Handler并且它现在附加到线程并处理来自我的后台线程的消息(通过重写的handleMessage方法),如果我单击一个按钮会发生什么例如,当Handler仍在处理来自后台线程的消息的过程中时,该活动(如果我有一个按钮在我的布局中执行某些操作)?什么对象处理按钮单击事件(考虑到可能存在多个事件,是否必须通过处理程序?)

我希望我已经足够清楚了。谢谢。

1 个答案:

答案 0 :(得分:0)

从阅读documentation并查看this question,看起来每个处理程序都会按照您实例化它们的顺序接收消息。