• android多线程学习之handler


      在编写android多线程程序时,进程间通信交换信息的一种方式就是使用handler,非常方便。

      首先,在主线程里new一个Handler对象,并重写它的handleMessage(Message msg)方法,Message里有几个属性可以用来传递简单的int型参数,如what属性我们可以用来标记信息的种类(这在有N个线程N个Message时非常有用,可以用老区分是哪个线程发送的什么消息),这时你可以定义几个static final int变量,用来给what分类;还有arg1和arg2两个属性可以用来存储int型消息内容,obj属性可以用来传递其他对象。

      下面这个程序,我在新线程里做了一个循环,每隔一秒给主线程发送一个消息,每次传一个不同的int数据,在主线程里显示出来。

    //thread_activity.java

    package com.jiadebin.android;

    import android.app.Activity;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.util.Log;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.widget.Button;
    import android.widget.TextView;

    public class thread_activity extends Activity {
     private final static String TAG = "THREAD_ACTIVITY";  //调试标记
     public final static int MUTI_THREAD = 0;  //用于what属性的标记变量
     public final static int COMPLETE_THREAD = 1;  //用于what属性的标记变量
     
     private Button btn;
     private TextView tv;
     private Handler handler = new Handler(){
      
      @Override
      public void handleMessage(Message msg) {   //重写处理消息的方法
       // TODO Auto-generated method stub
    //   Log.v(TAG, ""+msg.what);
       if(msg.what==MUTI_THREAD){
        tv.setText(""+msg.arg1);
       }
       else if(msg.what==COMPLETE_THREAD){
        tv.setText("complete");
        btn.setText("complete");
       }
       super.handleMessage(msg);
      }
      
     };
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            tv = (TextView) findViewById(R.id.tv);
            btn = (Button)findViewById(R.id.btn);
            btn.setOnClickListener(new OnClickListener() {
       @Override
       public void onClick(View v) {
        // TODO Auto-generated method stub
        start_thread();
        btn.setText("running...");
       }
      });
           
        }
     private void start_thread() {
      // TODO Auto-generated method stub
      new Thread(){    //新线程

       @Override
       public void run() {
        // TODO Auto-generated method stub
        int i = 100;
        int j = 0;
        Message msg = new Message();
        for(j=1;j<i;j++){
         Log.v(TAG, "J = "+j);
         msg.what = MUTI_THREAD;
         msg.arg1 = j;
         handler.sendMessage(msg);    //每次发送一个消息
         try { 
          Thread.sleep(1000);
         } catch (InterruptedException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
         }
        }
        msg.what = COMPLETE_THREAD;
        handler.sendMessage(msg);     //完成时,改变what属性
        
       }
       
      }.start();
     }
    }

    //main.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        >
    <TextView 
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/hello"
        />
    <Button
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:text="点击我开始线程"
     android:id="@+id/btn"
     ></Button>
    <TextView
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:id="@+id/tv"
     ></TextView>
    </LinearLayout>

  • 相关阅读:
    CH6201走廊泼水节
    P3366 (模板)最小生成树
    linux 基础语法
    django 3.1 序列化讲述
    django 的基础设计
    django 的初始项目结构
    http
    mysql(一)
    反射型xss
    html(四)
  • 原文地址:https://www.cnblogs.com/JackJia/p/2197921.html
Copyright © 2020-2023  润新知