在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. wamp本地安装phpwind问题:‘Rewrit…

    一.问题出现的现象: 1.http://localhost/phpwind_v9.0_utf8/upload/install.php显示. 2.apache错误文件httpd.conf显示: .hta ...

  2. 单页面应用(spa)引入百度地图(Cannot read property 'dc' of undefined)

    难点介绍 引入百度地图的时候,用原生的获取不到dom节点. ( var mapEle = document.getElementById(testApi): var map = new BMap.Ma ...

  3. metasploit快速入门

    今天没上班,在小黑屋里看了一个一百多页的书<metasploit新手指南>,在此将笔记分享给大家.欢迎大家批评指正,共同学习进步.     metasploit新手指南 笔记 kali 0 ...

  4. DynamicXml

    /* var xml = @"<root><books><book is_read=""false""><a ...

  5. 前端到后台ThinkPHP开发整站(4)

    今晚继续我的这个项目的开发,今晚也是写的不多,主要写了一个菜单管理功能的CURD方法,前端界面还没有进行编写. 菜单管理Model层的代码: <?php namespace Common\Mod ...

  6. Linux - 简明Shell编程10 - 管道(Pipe)

    脚本地址 https://github.com/anliven/L-Shell/tree/master/Shell-Basics 示例脚本及注释 #!/bin/bash echo '##### Num ...

  7. ESLint入门

    ESLint是一个用于识别和报告ECMAScript/JavaScript中代码格式的工具,目的是使代码风格更加统一和避免错误. 1.安装和使用有两种方式去安装ESLint:全局和本地. 1.1本地安 ...

  8. Oracle SQL优化[转]

    Oracle SQL优化 1. 选用适合的ORACLE优化器 ORACLE的优化器共有3种: a. RULE (基于规则) b. COST (基于成本) c. CHOOSE (选择性) 设置缺省的优化 ...

  9. Ubuntu 14.04.4 下 scp 远程拷贝提示:Permission denied, please try again. 的解决办法

    我在 s0 主机上远程拷贝 /etc/hosts 文件到 s1 主机上,出现下面的错误提示: qiao@s0:~$ scp /etc/hosts root@s2:/etc/root@s2's pass ...

  10. SQL查询操作及子句优先级

    用source .sql文件竟然可以自动建表. 简单数据查询: select * from table_name; 避免重复查询: select distinct(field_name) from t ...