Anndroid学习---使用线程Handler

本文介绍了Android应用中如何正确地在非UI线程与UI线程之间进行通信,特别是使用Handler来更新UI的方法。文章通过两个示例展示了如何避免因在非UI线程中直接修改UI元素而导致的异常,并演示了利用Handler发送消息更新UI的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Anndroid学习—使用线程 Handler

使用Java里面常用的线程调用方式,发现不可以

1 .

package com.example.administrator.myapplication;

import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

public class MainActivity extends AppCompatActivity {
 EditText editText;
    Button button;
    Handler handler;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        editText = (EditText) findViewById(R.id.editText2);
        button = (Button) findViewById(R.id.button);
       /* handler = new Handler(){
            @Override
            public void handleMessage(Message msg) {
//                super.handleMessage(msg);
                editText.setText("star Thread");
            }
        };*/
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
//                editText.setText("sss");
                MyThread myThread = new MyThread();
                myThread.start();
            }
        });
    }
    class  MyThread extends  Thread{
        @Override
        public void run() {
//         super.run();
      editText.setText("star Thread");
           /* try {
            Thread.sleep(6000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }*/
//            handler.sendEmptyMessage(0);
        }
    }
}

2 . 分析错误

E/AndroidRuntime: FATAL EXCEPTION: Thread-192
                  Process: com.example.administrator.myapplication, PID: 3528
                  android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
                      at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:6357)
                      at android.view.ViewRootImpl.invalidateChildInParent(ViewRootImpl.java:909)
                      at android.view.ViewGroup.invalidateChild(ViewGroup.java:4690)

Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行,如果在非UI线程中直接操作UI线程,
会抛出android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that
created a view hierarchy can touch its views,这与普通的java程序不同。

由于UI线程负责事件的监听和绘图,因此,必须保证UI线程能够随时响应用户的需求,
UI线程里的操作应该向中断事件那样短小,费时的操作(如网络连接)需要另开线程,
否则,如果UI线程超过5s没有响应用户请求,会弹出对话框提醒用户终止应用程序(ANP)。
如果在新开的线程中需要对UI进行设定,就可能违反单线程模型,
因此android采用一种的Message Queue机制保证线程间通信。
可以在自己的子线程中创建Handler与UI thread通讯

线程的简单使用-点击按钮文本框显示指定内容

package com.example.administrator.myapplication;

import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;

public class MainActivity extends AppCompatActivity {
 EditText editText;
    Button button;
    Handler handler;
    MyThread myThread;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        editText = (EditText) findViewById(R.id.editText2);
        button = (Button) findViewById(R.id.button);
       handler = new Handler(){
            @Override
            public void handleMessage(Message msg) {
//                super.handleMessage(msg);
               editText.setText("star Thread");
            }
        };
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
//                editText.setText("sss");
                 myThread = new MyThread();
                myThread.start();
            }
        });
    }
    class  MyThread extends  Thread{
        @Override
        public void run() {
                while(true){
                try {
                    Thread.sleep(1000);
                    handler.sendEmptyMessage(0);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

这里写图片描述

用thread handler 实现图片变换

package com.example.administrator.myapplication;

import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;

public class MainActivity extends AppCompatActivity {
 EditText editText;
    Button button;
    Button button2;
    Handler handler;
    ImageView imageView;
    MyThread myThread;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        editText = (EditText) findViewById(R.id.editText2);
        button = (Button) findViewById(R.id.button);
        imageView = (ImageView) findViewById(R.id.imageView);
        button2= (Button) findViewById(R.id.button2);

       handler = new Handler(){
            @Override
            public void handleMessage(Message msg) {
//                super.handleMessage(msg);
                switch (msg.what){
                    case 1 :
                        imageView.setImageResource(R.mipmap.ic_launcher);
                        break;
                    case  2 :
                        imageView.setImageResource(R.mipmap.abc_ic_star_black_16dp);
                        break;
                }
               // editText.setText("star Thread");

            }
        };
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
//                editText.setText("sss");
                 myThread = new MyThread();
                myThread.is= true;
                myThread.start();
            }
        });
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                myThread.is= false;
            }
        });
    }
    class  MyThread extends  Thread{
        boolean is=true;
        @Override
        public void run() {

            int what = 1;
            while(is){
                try {
                    Thread.sleep(1000);
                    handler.sendEmptyMessage((what++)%2+1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值