Android 线程

原则上只有主线程能够对View进行操作,worker线程不能对其操作,但有些View也可以通过worker线程来操作,比如进度条,不过主线程一般是用于接收用户的输入,以及将运算结果反馈给用户,因为如果放一些耗时长,容易阻塞的操作在主线程容易造成程序卡死,因此需要放在worker线程里

实例:线程控制进度条自动增加
class ButtonListener implements OnClickListener{
    public void onClick(View v){
        MainThread thread = new MainThread();
        thread.start();
    }
}
class MainThread extends Thread{
    public void run(){
        for(int i = 0; i<=100; i++){
            progressBar.incrementProgressBy(1);
            progressBar.incrementSecondaryProgressBy(2);
            System.out.println(Thread.currentThread().getName());   //在后台输出当前线程名,会发现第一次多一个线程
            try {
                sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

注:
因为worker线程无法随意修改View,所以这里可以由handle来实现,其在worker线程当中发送数据,然后在主线程当中取出,然后就可以修改View了

handler使用步骤

(1)定义一个Handler:(注意导入的是android.os.Handlerprivate Handler handler;
(2)新建一个handler类,并写入接收消息方法:

class MyHandler extends Handler{
    public void handleMessage(Message msg){ //方法名别打错了
        String s = (String) msg.obj;    //接收发送的消息
        textView.setText(s);    //其在主线程中,所以可以修改View
    }
}

(3)实例化一个handler(如果在主线程中实例化,那么就可以通过handler修改View了):handler = new MyHandler();
(4)在线程中发送messagehandler中接收:

Message msg = handler.obtainMessage();
msg.obj = "abc";    //给发送的消息赋值
handler.sendMessage(msg);   //将消息发送
实例:线程无法使用textView.setText()

比如:

class ButtonListener implements OnClickListener{
    public void onClick(View v){
        WorkThread thread = new WorkThread();
        thread.start(); //这里相当于用监听器调用worker线程,然后worker线程将textView的文本改成abc,看似语法没问题,但是运行时却会报错,因为worker线程原则上无法修改View
    }
}
class WorkThread extends Thread{
    public void run(){
        textView.setText("abc");
    }
}
实例:用handler实现上述修改View

在onCreate中:

handler = new MyHandler();
监听器、线程、handler
class ButtonListener implements OnClickListener{
        public void onClick(View v){
            WorkThread t = new WorkThread();
            t.start();
        }
    }
    class WorkThread extends Thread{
        public void run(){
            Message msg = handler.obtainMessage();
            msg.obj = "abc";    //给发送的消息赋值
            handler.sendMessage(msg);   //将消息发送
        }
    }
    class MyHandler extends Handler{
        public void handleMessage(Message msg){ //方法名别打错了
            String s = (String) msg.obj;    //接收发送的消息
            textView.setText(s);    //其在主线程中,所以可以修改View
        }
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 第5章 多线程编程 5.1 线程基础 5.1.1 如何创建线程 在java要创建线程,一般有==两种方式==:1)...
    AndroidMaster阅读 1,810评论 0 11
  • 当我们需要执行一些耗时操作,比如说发起一条网络请求时,考虑到网速等其他原因,服务器未必会立刻响应我们的请求,如果不...
    常思行阅读 1,252评论 3 27
  • 前言:线程是稀缺资源,如果被无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,合理的使用线程池对线程进行统一...
    SDY_0656阅读 749评论 0 1
  • 太长了,不想看? 在Android开发中,我们需要正确的在不同的线程中开展工作: 总是在UI线程中响应用户操作以及...
    joeey_y阅读 1,517评论 0 3
  • redis操作token
    jmyang1518阅读 2,063评论 0 0