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 ...
随机推荐
- Mac OS 终端强化美化:iterm2 + zsh + oh~my~zsh 设置教程
为了获得更好的排版效果,文章改用markdown撰写,故重发一次. 前言 mac自带的terminal终端没有文件名高亮等功能,而且界面不是很好看,故今晚学舍友折腾了终端,可以让自己使用起来更加方便, ...
- 和为s的两个数字 和为s的连续正数序列
输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s,如果有多对数字的和等于s,输出任意一对即可. #include <iostream> using namesp ...
- Git常用的基本操作
一.如何学习git指令 1.查看帮助:git help2.查看指定命令:git help clone3.搜索关键字:/chone 4.退出帮助文档:输入Q 二.常见命令 1.初始化git本地仓库:先进 ...
- go的相关用法
1. have gone to和have been to的区别 have gone to和have been to的区别如下: 1.have gone to,第三人称时用 has gone to ha ...
- java 枚举类型的使用
应用 http://blog.csdn.net/qq_27093465/article/details/52180865 原理 http://blog.csdn.net/javazejian/art ...
- visual studio 的生成、重新生成、清理功能的说明
生成 生成当前选中的项目,依赖的项目如果已经生成dll,则不生成,直接拷贝过来 重新生成 生成当前选中的项目,依赖的项目也会生成 清理 清除掉生成的dll和相关文件
- 小白用shiro(2)
本文来自网易云社区 作者:王飞 以上的配置走完以后就可以用,下面讲讲个人需求,以及踩过的坑: 1.如何修改cookie的名称,默认名称"rememberMe"太丑了有木有? 首先丢 ...
- 【编程工具】Sublime Text3快捷键配置
我们在使用编译软件时,总是喜欢使用快捷键来方便我们的操作,但有些编译软件不支持快捷键的修改和设置,为了能够更加方便的使用 Sublime Text3,这里我介绍几个 Sublime Text3 设置快 ...
- pytorch将cpu训练好的模型参数load到gpu上,或者gpu->cpu上
假设我们只保存了模型的参数(model.state_dict())到文件名为modelparameters.pth, model = Net() 1. cpu -> cpu或者gpu -> ...
- [uiautomator篇] UiWatcher的使用
//package com.softwinner.pad.mark3d; package com.softwinner.performance.benchmark.mark3d; import and ...