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-05 21:57:41

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

java多线程核心技术梳理(附源码)

java多线程核心技术梳理(附源码) java多线程核心技术梳理附源码 写在前面 java多线程 对象及变量的并发访问 线程间通信 Lock的使用 定时器 单例模式与多线程 拾遗补增 参考资料 本文对多线程基础知识进行梳理,主要包括多线程的基本使用,对象及变量的并发访问,线程间通信,lock的使用,定时器,单例模式,以及线程状态与线程组. 写在前面 花了一周时间阅读<java多线程编程核心技术>(高洪岩 著),本文算是此书的整理归纳,书中几乎所有示例,我都亲手敲了一遍,并上传到了我的githu

Android跟踪球-手势移动图片-自定义控件(附源码)

由于我不会制作动画图片,所以先放几及其不具备代表性的展示图片. 我以前的思路是通过动态的设置xy坐标通过手势移动来识别,但是我后来试了一下,发现运行效果极差.所以偷闲做了下这个跟踪球控件,其实实现十分简单.只要大家熟悉自定义控件的使用以及手势识别.基本上就ok了. 现在我们看下这个控件的源码TouchMoveView.java package com.fay.touchmove; import android.annotation.SuppressLint; import android.con

自制Android中的短息备份器源码

短信的实体bean package com.examp.backsms.domain; public class SmsInfo { private String address; private String date; private String type; private String body; public SmsInfo() { } public SmsInfo(String address, String date, String type, String body) { thi

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

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

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

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

DELPHI中的多线程【深入VCL源码】

线程的基础知识 线程的组成.线程有两部分组成. 1.一个是线程的内核对象,操作系统用它来对线程实施管理.内核对象也是系统用来存放线程统计信息的地方. 2.另一个是线程堆栈,它用于维护线程在执行代码时需要的所有函数参数和局部变量. 进程从来不执行任何东西,它只是线程的容器.线程总是在某个进程环境中创建的,而且它的整个寿命期都在该进程中.这意味着线程在它的进程地址空间中执行代码,并且在进程的地址空间中对数据进行操作.因此,如果在单进程环境中,你有两个或多个线程正在运行,那么这两个线程将共享单个地址空

Android侧边栏的自定义实现(附源码)

本文要实现手指在手机上向左或向右移动时,能相应的移动左右两个视图.通过自定义来实现,不借助第三方插件. 先来看看效果:(源码免费下载) 目录: 一.实现思路 二.代码清单 三.效果与说明 下面,让我们开始吧: 一.实现思路 1.思路 菜单在左,内容在右,然后菜单显示时和手机右边框有一定的间隔,内容显示一小部分.内容全部显示时,菜单全部不可见.如下面两个图 显示内容 显示菜单 2.判断逻辑 这是判断手指按着屏幕和手指抬起时要不要显示还是隐藏菜单 二.代码清单 首先来看下布局: <LinearLay

(转)Android与js交互实例(附源码)

本文转载于:http://blog.csdn.net/ithomer/article/details/8737999# Android 中可以通过webview来实现和js的交互,在程序中调用js代码,只需要将webview控件的支持js的属性设置为true Android(Java)与JavaScript(HTML)交互有四种情况: 1) Android(Java)调用HTML中js代码 2) Android(Java)调用HTML中js代码(带参数) 3) HTML中js调用Android(

iOS 中只用3x图片解决方案(附源码)

随着Apple推出了6plus,图片资源成了一大问题,2x-640x960 2x-750x1334 3x-1242x2208,各种规格的图片,安装包必然增大了不少,那么多种类的图片难免会漏掉一些,所以自己写了一个UIImage的Category库,只需要在Bundle中添加3x的图片即可实现6plus使用3x图片,6及以下版本使用2x图片. 话不多说,详情见代码和使用方式 (如果有问题请直接回复,歇歇) // // UIImage+Compress.h // ImageCompress // /