Handler使用实例

实例1:

post(Runnable r)和post(Runnable r, long delayMillis),将指定Runnable(包装成PostMessage)加入到MessageQueue中,然后Looper不断从MessageQueue中读取Message进行处理。该用例只是new了Runable,但无Thread.start()的调用,因此并没有开启子线程

其中activity的代码如下:
public class MainActivity extends AppCompatActivity {

    private TextView text_view = null;
    private Button start = null;
    private Button end = null;
    Handler handler = new Handler();
    Runnable send_msg_runable = new Runnable()
    {
        public void run()
        {
            text_view.append("\nreceive msg.");
            handler.postDelayed(send_msg_runable, 2000);
        }
    };

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        text_view = (TextView)findViewById(R.id.text_view);
        start = (Button)findViewById(R.id.send);
        end = (Button)findViewById(R.id.end);
        start.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //将线程接口立刻送到线程队列中
                handler.post(send_msg_runable);
            }
        });

        end.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                handler.removeCallbacks(send_msg_runable);
            }
        });

    }

布局文件如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <Button
        android:id="@+id/send"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Start Send Msg"
        />
    <Button
        android:id="@+id/end"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Stop Send Msg"
        />

    <TextView
        android:id="@+id/text_view"
        android:layout_width="fill_parent"
        android:layout_height="200dip"
        android:text="msg"
        tools:context=".MainActivity" />
</LinearLayout>

实例2:

public class MainActivity extends AppCompatActivity {

    private ProgressBar progress_bar = null;
    private Button start = null;

    Handler mHandler = new Handler()
    {
        @Override
        public void handleMessage(Message msg) {
            progress_bar.setProgress(msg.arg1);
            mHandler.post(mRunable);
        }
    };

    Runnable mRunable = new Runnable()
    {
        int m = 0;
        public void run() {
            // TODO Auto-generated method stub
            m += 10;
            Message msg = mHandler.obtainMessage();
            msg.arg1 = m;
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // TODO: handle exception
                e.printStackTrace();
            }
            //发送消息
            mHandler.sendMessage(msg);
            if(m == 100)
                //从线程队列中移除线程
                mHandler.removeCallbacks(mRunable);
        }
    };

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        progress_bar = (ProgressBar)findViewById(R.id.progress_bar);
        start = (Button)findViewById(R.id.send_msg);

        start.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //让进度条显示出来
                progress_bar.setVisibility(View.VISIBLE);
                //将线程加入到handler的线程队列中
                mHandler.post(mRunable);
            }
        });
    }
}

布局如下:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >
    <ProgressBar
        android:id="@+id/progress_bar"
        android:layout_width="fill_parent"
        android:layout_height="100dip"
        android:layout_alignParentBottom="true"
        style="?android:attr/progressBarStyleHorizontal"
        android:visibility="gone"
        />
    <Button
        android:id="@+id/send_msg"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:text="send msg"
        />

</RelativeLayout>

说明:该实例也没有开启子线程

实例3:

主线程和子线程各自拥有一个handler,双向通信,

通过Looper.myLooper()获取当前线程Looper,子线程需要调用Looper.prepare和Looper.loop初始化looper

UI线程通过getMainLooper获取主线程looper

Activity代码如下:

public class MainActivity extends AppCompatActivity {

    public static final String TAG = "MainActivity";
    private TextView mTextView;
    private Handler1 mSubThreadHandler;
    private Handler2 mMainThreadHandler;
    private int counter=0;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();
    }

    private void init() {
        mTextView = (TextView) findViewById(R.id.text);


        new Thread() {
            public void run() {
                Looper.prepare();
                //Looper.myLooper()获取当前线程的looper
                mSubThreadHandler=new Handler1(Looper.myLooper());
                Message message = new Message();
                message.obj = "子线程发送的消息";
                //子线程给自己发消息
                mSubThreadHandler.sendMessage(message);
                Looper.loop();
            };
        }.start();

    }

    private class Handler1 extends Handler {

        private Handler1(Looper looper) {
            super(looper);
        }

        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            //子线程解析消息
           Log.d(TAG,"子线程收到:" + msg.obj);

            //子线程发消息到主线程
            mMainThreadHandler = new Handler2(getMainLooper());
            Message message = new Message();
            message.obj = "abc";
            mMainThreadHandler.sendMessage(message);
        }
    }

    private class Handler2 extends Handler {

        private Handler2(Looper looper) {
            super(looper);
        }

        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            //主线程解析消息
            mTextView.setText("主线程收到子线程消息:" + msg.obj);

            //主线程发消息到子线程
            if (counter==0) {
                Message message = new Message();
                message.obj = "主线程发送的消息mmm";
                mSubThreadHandler.sendMessage(message);
                counter++;
            }

        }
    }

}

布局文件如下:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >
    <TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="text"
        android:layout_centerInParent="true"
        android:layout_marginTop="70dip" />
    
</RelativeLayout>

运行结果如下:

猜你喜欢

转载自blog.csdn.net/gz2012zb/article/details/81630593
今日推荐