android入门 — 多线程(一)

  android中的一些耗时操作,例如网络请求,如果不能及时响应,就会导致主线程被阻塞,出现ANR,非常影响用户体验,所以一些耗时的操作,我们会想办法放在子线程中去完成。

  android的UI操作并不是线程安全的,所以多个线程并发操作UI组件的时候,则可能导致线程安全问题。为了解决这个问题,android只允许UI线程修改UI组件。

  

public class MainActivity extends AppCompatActivity
{
    TextView textView;
    Button changeText;
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        changeText = (Button)findViewById(R.id.btn);
        textView = (TextView)findViewById(R.id.textView);
        changeText.setOnClickListener(this);
    }

    public void change(View view)
    {
        switch (view.getId())
        {
            case R.id.btn:
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        textView.setText("被改变了");
                    }
                }).start();
                break;
            default:
                break;
        }
    }
}

  在xml中定义了一个按钮和一个TextView,当点击按钮的时候,开启子线程去更改TextView中的文字,但是在编译的时候是无法通过的,因为不允许在子线程中直接对UI线程中组件进行操作。

  需要借用Handler来实现子线程更新UI组件的功能。

public class MainActivity extends AppCompatActivity
{

    private TextView textView;
    private Handler handler = new Handler()
    {
        //接收的是消息队列中的msg
        public void handleMessage(Message msg)
        {
            switch (msg.what)
            {
                case 0x0001:
                    int index = msg.arg1;
                    textView.setText(index + "");
                    break;
            }
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = (TextView)findViewById(R.id.textView1);
    }

    public void changeNumber(View view)
    {
        switch (view.getId())
        {
            case R.id.btn:
                new Thread()
                {
                    public void run()
                    {
                        for(int i = 0; i < 10; i++)
                        {
                            Message msg = new Message();
                            //msg.what是必不可少的,需要用来做判定
                            msg.what = 0x0001;
                            msg.arg1 = i;
                            handler.sendMessage(msg);
                            try {
                                Thread.sleep(1000);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }.start();
                break;
        }
    }
}

  

MessageQueue消息队列

  android采用的是MessageQueue机制保证线程间通信。

  MessageQueue是一个消息队列,用来存放通过Handler发布的消息,Android在第一次启动程序的时候会默认为UI线程创建一个关联的消息队列,用来管理程序的组件,如Activity、BroadcastReceiver、Service等。

Handler消息传递机制

  工作线程通过handler对象和主线程进行通信

  Handler对象所有工作都在主线程中执行

  Handler类需要实现handleMessage()方法,来处理消息队列中取出的Message对象

  handleMessage()方法由主线程调用,可以在需要的时候更新UI线程,但是必须确保此方法快速完成,因为其他的UI操作会等待它完成才能执行

  

时间: 2024-08-27 10:03:21

android入门 — 多线程(一)的相关文章

小猪的Android入门之路 Day 8 part 4

小猪的Android入门之路 Day 8 part 4 Android网络编程浅析--Android网络数据的上传 --转载请注明出处:coder-pig 本节引言: 在part 3中我们已经学习了Android网络数据的下载,难点是多线程断点续传下载; 有下载,当然也有上传啦,本节就来研究下Android中的网络数据的上传! 1.使用GET或者Post方式上传数据给服务器 2.使用开源框架HttpClient上传数据到服务区 3.发送xml数据给服务器 4.通过Http协议上传文件 5.Web

linux.linuxidc.com - /2011年资料/Android入门教程/

本文转自 http://itindex.net/detail/15843-linux.linuxidc.com-%E8%B5%84%E6%96%99-android Shared by Yuan 用户名与密码都是www.linuxidc.com linux.linuxidc.com - /2011年资料/Android入门教程/ [转到父目录] 2011年7月16日 21:33 <目录> Android 3D 游戏开发教程 2011年8月18日 13:26 <目录> Android

小猪的Android入门之路 Day 8 part 5

小猪的Android入门之路 Day 8 part 5 Android网络编程浅析--WebView浏览器编程初涉 --转载请注明出处:coder-pig 本节引言: 不知不觉Android网络编程浅析也快接近尾声了,在这part中我们学习了很多关于android 在网络方面的编程,现在我们来回顾一下吧! part 1:xml文件的简单了解:以及android中解析xml文件的一些常用方式:sax,dom,pull解析xml part 2:Android访问网络资源:HTML协议,获取图片,获取

小猪的Android入门之路 Day 8 part 3

小猪的Android入门之路 Day 8 part 3 Android网络编程浅析--Android网络数据的下载 --转载请注明出处:coder-pig 本节引言: 我们的应用很多时候都会涉及到网络数据的下载,比如缓存图片,当我们的 Apk需要进行版本更新时都需要下载文件;通常下载文件的操作都是放在后台 进行的,就是使用Service来完成,鉴于我们还没学到,所以这里都用Activity进行 演示!本章讲解的知识点有三个,单线程下载;普通多线程下载;多线程断点续传下载! 多线程断点续传比较难以

小猪的Android入门之路 Day 8 part 6

小猪的Android入门之路 Day 8 part 6 Android网络编程浅析--Socket网络编程初涉 --转载请注明出处:coder-pig 本节引言 终于迎来了Android网络编程的最后一节:Android中的Socket编程,在这一节中我们 首先需要对TCP/IP协议的概念,以及Socket的相关知识进行介绍,接着介绍下Socket的简单 流程,最后使用Socket创建简单的Android聊天室以及Socket实现大文件的断点上传 好了,开始本节内容! 本节学习路线图: 正文:

小猪的Android入门之路 Day 7 part 3

小猪的Android入门之路 Day 7 part 3 Android的数据存储与访问之--SQLite数据库 ---转载请注明出处:coder-pig 本节引言: 前两part中我们学习了使用文件与SharedPreference来保存数据,但是在很多情况下, 文件并不一定是有效的,如多线程并发访问是相关的;app要处理可能变化的复杂数据结构等等! 比如银行的存钱与取钱!对于这些情况就需要用到数据库了!而Android也给我们提供了内置 的SQLite数据库支持,SQLite非常精巧,不像Or

android入门开发教程之网络性能的优化

我在麦子学院上android开发的时候,麦子学院android开发老师讲到Android开发过程中经常会涉及到性能优化的问题,应该从基础.网络.测试等各个层面进行整合优化.现在咱们聊聊Android开发之网络性能的优化. 1)避免频繁网络请求 访问server端时,建立连接本身比传输需要跟多的时间,如非必要,不要将一交互可以做的事情分成多次交互(这需要与Server端协调好).有效管理Service 后台服务就相当于一个持续运行的Acitivity,如果开发的程序后台都会一个service不停的

Android入门:Activity四种启动模式

Android入门:Activity四种启动模式 一.启动模式介绍 启动模式简单地说就是Activity启动时的策略,在AndroidManifest.xml中的标签的android:launchMode属性设置: 启动模式有4种,分别为standard.singleTop.singleTask.singleInstance: 讲解启动模式之前,有必要先讲解一下“任务栈”的概念; 任务栈 每个应用都有一个任务栈,是用来存放Activity的,功能类似于函数调用的栈,先后顺序代表了Activity

Android中多线程编程(四)AsyncTask类的详细解释(附源码)

Android中多线程编程中AsyncTask类的详细解释 1.Android单线程模型 2.耗时操作放在非主线程中执行 Android主线程和子线程之间的通信封装类:AsyncTask类 1.子线程中更新UI 2.封装.简化异步操作. 3.AsyncTask机制:底层是通过线程池来工作的,当一个线程没有执行完毕,后边的线程是无法执行的.必须等前边的线程执行完毕后,后边的线程才能执行. AsyncTask类使用注意事项: 1.在UI线程中创建AsyncTask的实例 2.必须在UI线程中调用As