Android中的多线程编程(一)附源代码

Android中多线程编程:Handler类、Runnable类、Thread类之概念分析

1.Handler类:

Handler是谷歌封装的一种机制:能够用来更新UI以及消息的发送和处理。Handler是执行在主线程(UI线程)。

(2).使用Handler机制的原因:

这是谷歌封装的一种更新UI机制和消息机制。假设不使用这个来更新UI和发送处理消息的时候就会抛出异常。

(3).Handler的使用:

Handler发送消息事实上是发送给自己。也就是说由自己来进行发送和处理。是由于Handler内部和Looper相关联。

A.更新UI界面方面:

package com.chengdong.su.handlerdemo;

import android.app.Activity;
import android.app.ActionBar;
import android.app.Fragment;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.os.Build;

/**
 * Handler用途1:更新UI界面中的组件
 *
 * @author scd
 *
 */
public class MainActivity extends Activity {
    private ImageView mView;

    /** 数据源 */
    private int[] mImage = { R.drawable.ic_1, R.drawable.ic_2, R.drawable.ic_3 };
    /** 图片所在的位置 */
    private int mIndex = 0;
    /** the object of the Handler */
    private Handler mHandler = new Handler();
    /** the object of the Runnable */
    private MyRunnable mRunnable = new MyRunnable();

    Runnable runnable = new Runnable() {

        @Override
        public void run() {
            mIndex++;
            mIndex = mIndex % 3;
            mView.setImageResource(mImage[mIndex]);
            // 再次调用Runnable对象,每隔一秒钟调用一次run()方法
            mHandler.postDelayed(runnable, 1000);
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.fragment_main);
        init();
        // 方法一:
        // mHandler.postDelayed(runnable, 1000);
        // 方法二:自己定义Runnable对象
        mHandler.postDelayed(mRunnable, 1000);
    }

    /***
     * init the view
     */
    private void init() {
        mView = (ImageView) findViewById(R.id.imageView1);
    }

    /**
     * 任务:业务逻辑
     *
     * @author scd
     *
     */
    private class MyRunnable implements Runnable {
        @Override
        public void run() {
            mIndex++;
            mIndex = mIndex % 3;
            mView.setImageResource(mImage[mIndex]);
            // 再次调用Runnable对象,每隔一秒钟调用一次run()方法
            mHandler.postDelayed(mRunnable, 1000);

        }
    }

}

B.消息处理方面:

package com.chengdong.su.handlerdemo;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.widget.ImageView;

/**
 * Handler用途1:更新UI界面中的组件
 *
 * @author scd
 *
 */
public class MainActivity extends Activity {
    private String TAG = "MainActivity";
    private boolean Flag;
    private ImageView mView;

    /** the object of the Handler */
    private Handler mHandler = new Handler() {
        public void handleMessage(android.os.Message msg) {
            switch (msg.what) {
            case 0: {
                mView.setImageResource(R.drawable.ic_1);
                Log.d(TAG, "消息1");
                break;
            }
            case 1: {
                mView.setImageResource(R.drawable.ic_2);
                Log.d(TAG, "消息2");
                break;
            }
            default:
                break;
            }

        };
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.fragment_main);
        init();
        if (Flag) {
            mHandler.sendEmptyMessage(0);

        } else {

            mHandler.sendEmptyMessage(1);
        }

    }

    /***
     * init the view
     */
    private void init() {
        mView = (ImageView) findViewById(R.id.imageView1);
    }

}

2.Runnable类:

Runnable类是在UI线程中执行的,并没有创建新的线程。Runnable类是一个接口,通过覆写该类中的run()方法来实现业务逻辑需求。

来更新UI界面中的组件。Runnable类仅仅是一个任务接口。是开启的线程的执行的任务。

3.Thread类:

实现Runnable类中的run()方法,Thread类调用该run()方法来执行新开启的线程,线程须要执行的内容都在该run()方法中来完毕。

(1).start()方法:该方法启动一个线程。

可是此线程是处于就绪状态,并没有执行。然后通过Thread系统类自己主动调用run()方法来完毕执行操作。

(2).run()方法:该方法成为线程体。包括了要执行的线程的内容。run()方法执行结束,此线程终止。

package com.chengdong.su.handlerdemo;

import android.app.Activity;
import android.app.ActionBar;
import android.app.Fragment;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import android.os.Build;

/**
 *
 * @author scd
 *
 */
public class SecondActivity extends Activity {
    private String TAG = getClass().getSimpleName();

    private TextView mView;
    private MyThread mThread;

    private Handler mHandler = new Handler() {
        public void handleMessage(android.os.Message msg) {
            Log.d(TAG, "Thread UI:" + Thread.currentThread().getId());
            mView.setText("111");
        };
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();
        System.out.println("--->UI线程:" + Thread.currentThread().getId());
        // 方法一:
        new Thread() {
            public void run() {

                System.out
                        .println("--->新的线程:" + Thread.currentThread().getId());

            };
        }.start();
        // 方法二:
        new Thread(new Runnable() {

            @Override
            public void run() {
                System.out
                        .println("--->新的线程:" + Thread.currentThread().getId());

            }
        }).start();

    }

    private void init() {
        mView = (TextView) findViewById(R.id.textView1);

    }

    class MyThread extends Thread {
        public Handler mHandler2;

        @Override
        public void run() {
            // 创建一个消息载体对象
            Looper.prepare();
            mHandler2 = new Handler() {
                public void handleMessage(android.os.Message msg) {
                    Toast.makeText(getApplicationContext(), "111", 1).show();
                };
            };
            // 循环机制
            Looper.loop();

        }
    }

}

总结:

Runnable()仅仅是一个任务的抽象,并非多线程。Thread.start()才是新开一个多线程。而且在新开的线程执行Thread。执行run()方法。多线程是Thread实现,跟Runnable没有太大关系。线程就是为了更好地利用CPU,提高程序执行速率的。

时间: 2024-10-25 16:19:21

Android中的多线程编程(一)附源代码的相关文章

Android中的多线程编程(一)附源码

Android中多线程编程:Handler类.Runnable类.Thread类之概念分析 1.Handler类: Handler是谷歌封装的一种机制:可以用来更新UI以及消息的发送和处理.Handler是运行在主线程(UI线程). (2).使用Handler机制的原因: 这是谷歌封装的一种更新UI机制和消息机制,如果不使用这个来更新UI和发送处理消息的时候就会抛出异常. (3).Handler的使用: Handler发送消息其实是发送给自己.也就是说由自己来进行发送和处理.是因为Handler

Android中的多线程编程(二)Handler的原理(附源码)

Android中Handler的原理 一.Handler的原理: 1.Handler.Looper.MessageQueue之间的关系. (1).Handler类:向MessageQueue消息队列中发送消息,接收Looper返回来的消息并处理. (2).Looper类: 存储消息队列的容器.负责接收Handler发送的消息,并直接把消息回传给Handler自己. (3).MessageQueue类:存储消息. 2.关系: (1).创建Handler对象的时候,它就会绑定到默认的线程(UI线程)

android中的多线程机制

Google参考了Windows的消息处理机制,在Android系统中实现了一套类似的消息处理机制.学习Android的消息处理机制,有几个概念(类)必须了解: 1.       Message 消息,理解为线程间通讯的数据单元.例如后台线程在处理数据完毕后需要更新UI,则可发送一条包含更新信息的Message给UI线程. 2.       Message Queue 消息队列,用来存放通过Handler发布的消息,按照先进先出执行. 3.       Handler Handler是Messa

Java中的 多线程编程

Java 中的多线程编程 一.多线程的优缺点 多线程的优点: 1)资源利用率更好2)程序设计在某些情况下更简单3)程序响应更快 多线程的代价: 1)设计更复杂虽然有一些多线程应用程序比单线程的应用程序要简单,但其他的一般都更复杂.在多线程访问共享数据的时候,这部分代码需要特别的注意.线程之间的交互往往非常复杂.不正确的线程同步产生的错误非常难以被发现,并且重现以修复. 2)上下文切换的开销当CPU从执行一个线程切换到执行另外一个线程的时候,它需要先存储当前线程的本地的数据,程序指针等,然后载入另

转载:android笔记--android中的多线程--Handler, Looper, MessageQueue, Message类

什么时候使用多线程: 1. 耗时操作使用多线程, 耗时操作放在UI线程中会导致用户的操作无法得到响应. 2. 阻塞操作使用多线程, 理由同上. 3. 多核CUP的设备使用多线程, 可以有效提高CPU的利用率. 4. 并行操作使用多线程. android中的多线程模型主要涉及的类有:Looper, Handler, MessageQueue, Message等. 一:Looper类: 1 static final ThreadLocal<Looper> sThreadLocal = new Th

Android中利用OpenMax 编程的基本流程

最近由于公司在做数字电视,播放器和模块由供应商打包一起卖,驱动调通了,可是播放器要硬件解码,和平台差异,原厂又没有相关文档,就自己试着看了一个系统的播放器流程,顺便整理了一下,也方便以后查询,希望对播放器硬解码的开发能起到点作用.由于对视频也不了解,所以难免有不少错误,欢迎高手指导. 1: 由文件或者设备来创建一个dataSource(DataSource) (其中可以是文件描述符fd, uri ,http) 2:  通过dataSource来创建一个MediaExtractor(即视频的分流器

每天进步一点点——论fork()函数与Linux中的多线程编程

转载请说明出处:http://blog.csdn.net/cywosp/article/details/27316803 一.fork()函数 在操作系统的基本概念中进程是程序的一次运行,且是拥有资源的最小单位和调度单位(在引入线程的操作系统中,线程是最小的调度单位).在Linux系统中创建进程有两种方式:一是由操作系统创建,二是由父进程创建进程(通常为子进程).系统调用函数fork()是创建一个新进程的唯一方式,当然vfork()也能够创建进程,可是实际上其还是调用了fork()函数.fork

Android中使用多线程的各种姿势

写在前面:内容主要为黄岳钊老师视频分享课的学习笔记. 1)为什么需要多线程处理? 解决耗时任务 文件IO.联网请求.数据库操作.RPC 提高并发能力 同一时间处理更多事情 防止ANR InputDispatching Timeout:输入事件分发超时5s(触摸或按键) Service Timeout:服务20s内未执行完 BroadcastQueue Timeout:前台广播10s内未执行完 ContentProvider Timeout:内容提供者执行超时 避免掉帧 要达到每秒60帧,每帧必须

第73课 Qt中的多线程编程

1. QThread类 (1)QThread是一个跨平台的多线程解决方案 (2)QThread以简洁易用的方式实现多线程编程 2. QThread中的关键成员函数 (1)virtual void run() :线程函数,用于定义线程功能(执行流). (2)void start():启动函数,将线程入口地址设置为run函数.启动线程,新线程开始执行run函数. (3)int exec():进入事件循环,直至调用exit().返回线程退出事件循环的返回码. (4)void terminate():强