在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学习记录:线程的更多相关文章

  1. Android学习记录(3)—Android中ContentProvider的基本原理学习总结

    一.ContentProvider简介        当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据.虽然使用其他方法也可以对外共享数据 ...

  2. mono for android 学习记录

    C#开发Android应用实战(全 扫描 中文版) 学习记录: 拖完控件后,不要急着按F5,需要重新生成,才能自动修改 Resource.Designer.cs 文件 1. Activity 是基于a ...

  3. JVM学习记录-线程安全与锁优化(二)

    前言 高效并发是程序员们写代码时一直所追求的,HotSpot虚拟机开发团队也为此付出了很多努力,为了在线程之间更高效地共享数据,以及解决竞争问题,HotSpot开发团队做出了各种锁的优化技术常见的有: ...

  4. android 学习记录-----------android 活动 意图 碎片

    将此篇博客作为记录android项目开发过程中的学习记录

  5. 中级实训Android学习记录——Toast、AlertDialog、ProgressBar

    学习记录 2020/11/22 Toast Toast Toast是一个消息提示组件 我们可以设置其显示的位置 自定义其显示的内容 对Toast的简单封装可以达到不同的目的 Toast的默认用法 To ...

  6. Android学习记录(三)——安装SQLite

    这次学习安装SQLite. 一.SQLite简介 重要特性:零配置,即不需要复杂的配置即可使用 详细:https://www.runoob.com/sqlite/sqlite-intro.html 二 ...

  7. 【Android】Android 学习记录贴

    官网 教程学习笔记 Genymotion 安卓虚拟器太慢,用Genymotion(装载eclipse的插件) 利用Genymotion运行Android应用程序 1.首先,点击 来启动或者创建您要使用 ...

  8. Android学习记录(6)—将java中的多线程下载移植到Android中(即多线程下载在Android中的使用)③

    在这一节中,我们就来讲多线程下载以及断点续传在android中怎么使用,前两节是为本节做准备的,没有看前两节的同学,最好看完前面的两篇文章再来看这篇.其实在android端的应用和java基本上是差不 ...

  9. Android学习记录(5)—在java中学习多线程下载之断点续传②

    在上一节中我们学习了在java中学习多线程下载的基本原理和基本用法,我们并没有讲多线程的断点续传,那么这一节我们就接着上一节来讲断点续传,断点续传的重要性不言而喻,可以不用重复下载,也可以节省时间,实 ...

随机推荐

  1. Canvas 仿百度贴吧客户端 loading 小球

    前言 几天前在简书上看到在一篇文章<Android仿百度贴吧客户端Loading小球>,看了一下作者,他写了两个好玩的 demo,效果图如下: 今天趁着周末有空,用 H5 的 Canvas ...

  2. [补档][NOIP2015] 斗地主

    [NOIP2015] 斗地主 题目 传送门:http://cogs.pro/cogs/problem/problem.php?pid=2106 INPUT 第一行包含用空格隔开的2个正整数Tn,表示手 ...

  3. 43. leetcode 459. Repeated Substring Pattern

    459. Repeated Substring Pattern Given a non-empty string check if it can be constructed by taking a ...

  4. Unity 坐标 转换 详解 World世界坐标 Screen屏幕坐标 View视口坐标 GUI坐标 NGUI坐标 localPosition相对父级坐标

    在制作游戏中我们经常会遇到这样一个需求: 在人物模型的上面显示 名字.称号 一类的文字或者图片 如下图 人物模型属于是Camera1   UI Title信息属于NGUI Camera2 如下图 这时 ...

  5. java.lang.NoSuchMethodError:android.content.Context.getDrawable

    今天在开发的时候,这个代码在源码中是可以看到的,但是在android 4.3手机上面会报错,具体错误信息和代码如下: setBackgroundDrawable(context.getDrawable ...

  6. 写一个Vue loading 插件

    什么是vue插件? 从功能上说,插件是为Vue添加全局功能的一种机制,比如给Vue添加一个全局组件,全局指令等: 从代码结构上说,插件就是一个必须拥有install方法的对象,这个方法的接收的第一个参 ...

  7. python学习===实现定时发送,方法一

    #比如每3秒打印一次helloworld:from threading import Timer def printHello(): print "Hello World" t = ...

  8. insertBefore 和 insetAfter函数详解

    在Javascript DOM编程艺术上面讲到,insertBefore(   )函数,即在已有元素前面插入一个新元素: 语法: parentElement . insertBefore(newEle ...

  9. C#多线程的用法2-线程的生命周期

    对于线程而言有两种类型:前台线程,后台线程.前台与后台线程性质相同,但终止条件不同. 后台线程:在运行过程中如果宿主进程结束,线程将直接终止执行:在强制终止时,线程即终止执行不论线程代码是否执行完毕. ...

  10. Node.js之包与npm包管理工具

    Node.js之包与npm包管理工具 1.Node.js中的包 1.1在一个包中包含如下内容: package.json:对包进行描述 在bin子目录中存放二进制文件 在lib子目录中存放JavaSc ...