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,提高程序执行速率的。

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

  1. Android中的多线程编程

    问题 Android的UI也是线程不安全的,如果要更新应用程序里的UI元素,必须在主线程中进行,否则就会抛异常.比如用一个Button的onClick函数去更新界面上的元素,就会得到一个CalledF ...

  2. Android中的多线程【转】

    感谢大佬:https://www.cnblogs.com/zoe-mine/p/7954605.html 感谢大佬:https://blog.csdn.net/u014555121/article/d ...

  3. JavaEE开发之Spring中的多线程编程以及任务定时器详解

    上篇博客我们详细的聊了Spring中的事件的发送和监听,也就是常说的广播或者通知一类的东西,详情请移步于<JavaEE开发之Spring中的事件发送与监听以及使用@Profile进行环境切换&g ...

  4. Java中的 多线程编程

    Java 中的多线程编程 一.多线程的优缺点 多线程的优点: 1)资源利用率更好2)程序设计在某些情况下更简单3)程序响应更快 多线程的代价: 1)设计更复杂虽然有一些多线程应用程序比单线程的应用程序 ...

  5. Python中的多线程编程,线程安全与锁(二)

    在我的上篇博文Python中的多线程编程,线程安全与锁(一)中,我们熟悉了多线程编程与线程安全相关重要概念, Threading.Lock实现互斥锁的简单示例,两种死锁(迭代死锁和互相等待死锁)情况及 ...

  6. Android DevArt5:如何在Android中创建多线程?

    本篇内容: 如何在Android中创建多进程?查看进程的三种方式有哪些? 多进程模式的运行机制?- 演示了多进程出现问题中的两种情况: 静态成员失效 Application多次创建 IPC基础概念介绍 ...

  7. Qt中的多线程编程

    http://www.ibm.com/developerworks/cn/linux/l-qt-mthrd/ Qt 作为一种基于 C++ 的跨平台 GUI 系统,能够提供给用户构造图形用户界面的强大功 ...

  8. C语言中的多线程编程

    很久很久以前,我对C语言的了解并不是很多,我最早听说多线程编程是用Java,其实C语言也有多线程编程,而且更为简单.方便.强大.下面就让我们简单领略一下Unix C语言环境下的多线程编程吧! 下面先看 ...

  9. .NET 4中的多线程编程之一:使用Task(转载)

    原文地址:http://www.cnblogs.com/yinzixin/archive/2011/11/04/2235233.html .NET 4为了简化多线程编程,提供了System.Threa ...

随机推荐

  1. (58)zabbix网络拓扑图配置network map

    zabbix网络地图介绍 “zabbix network map”可以简单的理解为动态网络拓扑图,可以针对业务来配置zabbix map, 通过map可以了解应用的整体状况:服务器是否异常.网络是否有 ...

  2. 刚毕业去面试Python工程师,这几道题太难了,Python面试题No11

    写在前面 本想停一段时间这个系列,但是好多朋友给我发信息说让我继续整理下去,so,继续吧~ 第1题: docstring是什么? docstring是一种文档字符串,用于解释构造的作用.我们在函数.类 ...

  3. python爬虫入门七:pymysql库

    我们使用python爬取得到的数据,有时候会数据量特别大,需要存入数据库. 需要注意的是,MySQL是一种关系型数据库管理系统,利用MySQL可以对数据库进行操作,而MySQL并不是一个数据库. 而p ...

  4. Codeforces Round #877 (Div. 2) E. Danil and a Part-time Job

    E. Danil and a Part-time Job 题目链接:http://codeforces.com/contest/877/problem/E time limit per test2 s ...

  5. JS(异步与单线程)

    JS(异步与单线程) 题目1.同步和异步的区别是什么,试举例(例子见知识点) 区别: 1.同步会阻塞代码执行,而异步不会 2.alert 是同步,setTimeout 是异步 题目2.关于 setTi ...

  6. BZOJ 1831: [AHOI2008]逆序对

    题目大意: 给出一个序列,有几个位置上的数字任意.求最小的逆序对数. 题解: 自己决定放置的数一定是单调不降的.不然把任意两个交换一下就能证明一定会增加逆序对. 然后就可以DP了,f[i][j]表示第 ...

  7. appium+python自动化-微信公众号webview操作

    前言 上一篇已经解决切换到微信公众号的webview上了,但是定位webview上元素的时候一直提示找不到,打印page_source也找不到页面上的元素,这个问题困扰了一整天,还好最后找到了原因, ...

  8. ZingChart 图表插件

    ZingChart提供了一个丰富的API,用于通过重新绘制绘图(重新加载) ,加载新数据(setseriesdata),修改现有图表(modifyplot), 放大数据范围(zoomto),切换各种交 ...

  9. 防火墙iptables介绍

    防火墙: netfilter/iptables是集成在Linux2.4.X版本内核中的包过滤防火墙系统.该架构可以实现数据包过滤,网络地址转换以及数据包管理功能.linux中防火墙分为两部分:netf ...

  10. 只操作git(cmd)就可以使用git将项目上传到github

    代码改变世界 使用git将项目上传到github(最简单方法) 首先你需要一个github账号,所有还没有的话先去注册吧! https://github.com/ 我们使用git需要先安装git工具, ...