Android学习记录:线程
在Java中,线程的建立方法如下。
新建一个类,接口Runnable,重载 run方法
import javax.swing.JTextField;
public class test implements Runnable{
@Override
public void run() {
}
}
在需要开始这个线程的地方,这样创建线程
private Thread th;
test te = new test();
th = new Thread(te);
th.start();
Java中调用线程的时候,可以直接访问JFrame上的组件,并更改其值,但是在安卓中,如果一个子线程涉及到UI更新,Android主线的线程是不安全的。更新UI只能在主线程中更新。
所以要把Message通过handler来send,然后利用callback来接收。
新建类,接口Callback
重载的handleMessage中就是对从子线程中传入的Message做处理。
import android.os.Handler.Callback;
import android.os.Message;
import android.widget.TextView;
public class CB implements Callback{
private TextView tv;
public TextView getTv() {
return tv;
}
public void setTv(TextView tv) {
this.tv = tv;
}
@Override
public boolean handleMessage(Message msg) {
int number = msg.arg1;
tv.setText("Test "+number);
return true;
}
}
实例化Handler对象,利用传入Callback对象的构造方法
Handler handler = new Handler(cb);
构造类,接口Runnable ,并传入Handler。
创建Message对象,给其两个参数赋值。利用Handler传出参数。
其中int类的message用来实现线程虚拟挂起的功能(运行死循环,但是不对参数进行改变)
import android.os.Handler;
import android.os.Message;
import android.widget.TextView;
public class Number implements Runnable{
private TextView tv;
private Handler handler;
private int message = 0;
public int getMessage() {
return message;
}
public void setMessage(int message) {
this.message = message;
}
public Handler getHandler() {
return handler;
}
public void setHandler(Handler handler) {
this.handler = handler;
}
public TextView getTv() {
return tv;
}
public void setTv(TextView tv) {
this.tv = tv;
}
@Override
public void run() {
int i = 0;
while(true){
if(message == 1){
continue;
}else{
i++;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Message msg = new Message();
msg.arg1 = i;
handler.sendMessage(msg);
}
}
}
}
所以,利用线程同时需要更新ui的话,构造顺序如下。
1.实例化接入了Callback的类,cb;
2.实例化接入了Runnable的类,num;
3.实例化Handler,利用传入Callback的构造方法;
4.cb中传入要更新的view;
5.num中传入message(挂起用);
6.num中传入handler;
7.start;
主Activity如下
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends Activity {
private int flag = 0;
private Number num;
private Thread th;
private TextView tv;
private CB cb;
private Handler handler;
private Button bu;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void Start(View v) {
if (flag == 0) {
num = new Number();
th = new Thread(num);
tv = (TextView)this.findViewById(R.id.Text);
cb = new CB();
cb.setTv(tv);
bu = (Button) this.findViewById(R.id.button);
handler = new Handler(cb);
num.setHandler(handler);
num.setTv(tv);
num.setMassage(0);
th.start();
bu.setText("Stop");
flag = 1;
} else if (flag == 1) {
bu.setText("Start");
num.setMassage(1);
flag = 2;
} else if( flag == 2){
bu.setText("Stop");
num.setMassage(0);
flag = 1;
}
}
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}
Android学习记录:线程的更多相关文章
- Android学习记录(3)—Android中ContentProvider的基本原理学习总结
一.ContentProvider简介 当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据.虽然使用其他方法也可以对外共享数据 ...
- mono for android 学习记录
C#开发Android应用实战(全 扫描 中文版) 学习记录: 拖完控件后,不要急着按F5,需要重新生成,才能自动修改 Resource.Designer.cs 文件 1. Activity 是基于a ...
- JVM学习记录-线程安全与锁优化(二)
前言 高效并发是程序员们写代码时一直所追求的,HotSpot虚拟机开发团队也为此付出了很多努力,为了在线程之间更高效地共享数据,以及解决竞争问题,HotSpot开发团队做出了各种锁的优化技术常见的有: ...
- android 学习记录-----------android 活动 意图 碎片
将此篇博客作为记录android项目开发过程中的学习记录
- 中级实训Android学习记录——Toast、AlertDialog、ProgressBar
学习记录 2020/11/22 Toast Toast Toast是一个消息提示组件 我们可以设置其显示的位置 自定义其显示的内容 对Toast的简单封装可以达到不同的目的 Toast的默认用法 To ...
- Android学习记录(三)——安装SQLite
这次学习安装SQLite. 一.SQLite简介 重要特性:零配置,即不需要复杂的配置即可使用 详细:https://www.runoob.com/sqlite/sqlite-intro.html 二 ...
- 【Android】Android 学习记录贴
官网 教程学习笔记 Genymotion 安卓虚拟器太慢,用Genymotion(装载eclipse的插件) 利用Genymotion运行Android应用程序 1.首先,点击 来启动或者创建您要使用 ...
- Android学习记录(6)—将java中的多线程下载移植到Android中(即多线程下载在Android中的使用)③
在这一节中,我们就来讲多线程下载以及断点续传在android中怎么使用,前两节是为本节做准备的,没有看前两节的同学,最好看完前面的两篇文章再来看这篇.其实在android端的应用和java基本上是差不 ...
- Android学习记录(5)—在java中学习多线程下载之断点续传②
在上一节中我们学习了在java中学习多线程下载的基本原理和基本用法,我们并没有讲多线程的断点续传,那么这一节我们就接着上一节来讲断点续传,断点续传的重要性不言而喻,可以不用重复下载,也可以节省时间,实 ...
随机推荐
- 安装oh-my-zsh
目标:安装oh-my-zsh,并使用last-working-dir插件(再次登录时,默认在上次退出时的目录)环境:CentOS 7.3.1611 最好看原著 -> https://github ...
- crm踩坑记(二)
Linux tmux 如何查看 tmux如何进行滚动呢? prefix + [, prefix为tmux的前置动作,默认是ctrl + b. 使用方向键或者pageUp来进行翻页. q可以退出滚动模式 ...
- webpack 引入 bootstrap
Bootstrap中是一种事实上的界面标准,标准到现在的网站大量的使用它.如果可以使用webpack引入的bootstrap,就可以一个npm install完成项目的依赖,而不必手工的添加到html ...
- 使用MySQL-Proxy读写分离时的注意事项
在动手操作前最好先安装好MySQL-Proxy,并配置好MySQL主从服务器.补充:新版MySQL已经内建支持 延迟问题 读写分离不能回避的问题之一就是延迟,可以考虑Google提供的SemiSync ...
- LINUX系统自动化部署shell脚本
#!/bin/shsudo /etc/init.d/tomcatstopwaitsudo rm -rf /opt/tomcat7/work/*waitsudo rm -rf /opt/tomcat7/ ...
- # webpack 3 & React 的简单配置 。
今天真是难过的一天
- Silverlight——施工计划日报表(二)
近来一直在加班,基本上没有个人时间.所以更新不会很即时. 长话短说,先从界面代码开始吧.界面代码很简单,如下所示: <UserControl xmlns:sdk="http://sch ...
- 设计模式原则(2)--Liskov Substitution Principle(LSP)--里氏替换原则
1.定义: 所有引用基类(父类)的地方必须能透明地使用其子类的对象.这一原则与继承紧密相关.如果对每一个类型为 T1的对象 o1,都有类型为 T2 的对象o2,使得以 T1定义的所有程序 P 在所有的 ...
- Ngnix+tomcat负载均衡
系统环境 Centos6.5 nginx1.4.7 https://nginx.org/download/nginx-1.4.7.tar.gz tomcat7.0.79 http://apache. ...
- Node.js之错误处理与断言处理
Node.js之错误处理与断言处理 1. 使用 domain 模块处理错误 try..catch 多用于捕捉同步方法中的抛出错误,但不能用try..catch捕捉异步方法中抛出de错误 如: 1 va ...