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中学习多线程下载的基本原理和基本用法,我们并没有讲多线程的断点续传,那么这一节我们就接着上一节来讲断点续传,断点续传的重要性不言而喻,可以不用重复下载,也可以节省时间,实 ...
随机推荐
- hdu--1798--Doing Homework again(贪心)
Doing Homework again Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- nodejs模块学习: express-session 解析
nodejs模块学习: express-session 解析 nodejs 发展很快,从 npm 上面的包托管数量就可以看出来.不过从另一方面来看,也是反映了 nodejs 的基础不稳固,需要开发者创 ...
- OpenOfice将offic转为pdf并且在web显示
1.将office首先要安装OpenOfice,傻瓜式安装就好了,之后可以使用下列代码将word转为pdf.这个需要导入jodconverter-2.2.2里的 ja r包 import java.i ...
- 2.ssh密钥登陆(ssh无密码登陆)
1.A主机生成密钥对 ssh-keygen -t rsa 2.将A主机的公钥发给B主机 scp id_rsa.pub linux2:/cloud ...
- Scala关于软件的安装(《Programming in Scala》这本书)
这篇文章主要介绍怎么在终端来写Scala语言.在Scala创始人出的Coursera课程中是让我们在IDE中sbt写Scala语言,而在这本书貌似让我们在终端上直接用Scala写.官网有介绍不过不详细 ...
- oracle 内连接,外连接
--内连接 inner join ... on --左外连接 left join ... on --右外连接 right join ... on 列: select * from stud ...
- 计蒜客模拟赛D1T1 蒜头君打地鼠:矩阵旋转+二维前缀和
题目链接:https://nanti.jisuanke.com/t/16445 题意: 给你一个n*n大小的01矩阵,和一个k*k大小的锤子,锤子只能斜着砸,问只砸一次最多能砸到多少个1. 题解: 将 ...
- mysql metadata lock
想必玩过mysql的人对Waiting for table metadata lock肯定不会陌生,一般都是进行alter操作时被堵住了,导致了我们在show processlist 时,看到线程的状 ...
- vi替换方法总结
1. 基本的替换 :s/vivian/sky/ 替换当前行第一个 vivian 为 sky :s/vivian/sky/g 替换当前行所有 vivian 为 sky :n,$s/vivian/sky/ ...
- mac corntab定期执行任务
mac corntab定期执行任务 crontab中的每一行代表一个定期执行的任务,分为6个部分.前5个部分表示何时执行命令,最后一个部分表示执行的命令.每个部分以空格分隔,除了最后一个部分(命令)可 ...