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,提高程序执行速率的。
Android中的多线程编程(一)附源代码的更多相关文章
- Android中的多线程编程
问题 Android的UI也是线程不安全的,如果要更新应用程序里的UI元素,必须在主线程中进行,否则就会抛异常.比如用一个Button的onClick函数去更新界面上的元素,就会得到一个CalledF ...
- Android中的多线程【转】
感谢大佬:https://www.cnblogs.com/zoe-mine/p/7954605.html 感谢大佬:https://blog.csdn.net/u014555121/article/d ...
- JavaEE开发之Spring中的多线程编程以及任务定时器详解
上篇博客我们详细的聊了Spring中的事件的发送和监听,也就是常说的广播或者通知一类的东西,详情请移步于<JavaEE开发之Spring中的事件发送与监听以及使用@Profile进行环境切换&g ...
- Java中的 多线程编程
Java 中的多线程编程 一.多线程的优缺点 多线程的优点: 1)资源利用率更好2)程序设计在某些情况下更简单3)程序响应更快 多线程的代价: 1)设计更复杂虽然有一些多线程应用程序比单线程的应用程序 ...
- Python中的多线程编程,线程安全与锁(二)
在我的上篇博文Python中的多线程编程,线程安全与锁(一)中,我们熟悉了多线程编程与线程安全相关重要概念, Threading.Lock实现互斥锁的简单示例,两种死锁(迭代死锁和互相等待死锁)情况及 ...
- Android DevArt5:如何在Android中创建多线程?
本篇内容: 如何在Android中创建多进程?查看进程的三种方式有哪些? 多进程模式的运行机制?- 演示了多进程出现问题中的两种情况: 静态成员失效 Application多次创建 IPC基础概念介绍 ...
- Qt中的多线程编程
http://www.ibm.com/developerworks/cn/linux/l-qt-mthrd/ Qt 作为一种基于 C++ 的跨平台 GUI 系统,能够提供给用户构造图形用户界面的强大功 ...
- C语言中的多线程编程
很久很久以前,我对C语言的了解并不是很多,我最早听说多线程编程是用Java,其实C语言也有多线程编程,而且更为简单.方便.强大.下面就让我们简单领略一下Unix C语言环境下的多线程编程吧! 下面先看 ...
- .NET 4中的多线程编程之一:使用Task(转载)
原文地址:http://www.cnblogs.com/yinzixin/archive/2011/11/04/2235233.html .NET 4为了简化多线程编程,提供了System.Threa ...
随机推荐
- mysql的字符串处理函数用法
1.LOCATE函数 LOCATE(substr,str) 返回子串 substr 在字符串 str 中第一次出现的位置.如果子串 substr 在 str 中不存在,返回值为 0.如果substr或 ...
- Linux 中 MySQL 授权远程连接
说明:当别的机子(IP )通过客户端的方式在没有授权的情况下是无法连接 MySQL 数据库的,如果需要远程连接 Linux 系统上的 MySQL 时,必须为其 IP 和具体用户进行授权.一般 root ...
- docker参考文档
docker 使用笔记 http://www.cnblogs.com/xguo/p/3829329.html docker数据存储 | 单线程 http://opjasee.com/2014/06/2 ...
- [php] 高级教程
include 和 require 语句用于在执行流中插入写在其他文件中的有用的代码. include 和 require 除了处理错误的方式不同之外,在其他方面都是相同的: require 生成一个 ...
- mysql函数总结
MySQL函数 MySQL数据库提供了很多函数包括: 数学函数:字符串函数:日期和时间函数:条件判断函数:系统信息函数:加密函数:格式化函数: 一.数学函数 数学函数主要用于处理数字,包括整型.浮点数 ...
- (转)iOS 属性字符串
富文本的基本数据类型是NSAttributedString.**属性化字符串**(attributed string)是把属性设置到某些字符上的字符串.属性可以是任何键值对,但是为了实现富文本,则通常 ...
- 牛客网暑期ACM多校训练营(第四场)G Maximum Mode(思维)
链接: https://www.nowcoder.com/login?callBack=%2Facm%2Fcontest%2F142%2FG 题意: 给定n个数, 要求删去恰好m个数后的最大总数是多少 ...
- POJ-1061 青蛙的约会 (扩展欧几里得)
[题目描述] 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事情,既没有 ...
- The North American Invitational Programming Contest 2018 E. Prefix Free Code
Consider nn initial strings of lower case letters, where no initial string is a prefix of any other ...
- asp.net下js调用session
大致方法为:js调用webservise,然后通过webservise将session值返回给js完成调用 其实最主要的一点就是在webmethod中允许session:[WebMethod(Enab ...