在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. Uva 679 Dropping Ballls 二叉树的编号

    这个程序常规处理起来数据量很大,I可以高达2^D-1 /* ....... */ 里面的代码块据此避免了开太大的数组 做太多的循环 #include<cstdio> #include< ...

  2. zabbix_server----邮箱报警

    zabbix邮件报警部署!!!!!!!!!!!!!!! Zabbix监控服务端.客户端都已经部署完成,被监控主机已经添加,Zabiix监控运行正常,通过查看Zabbix监控服务器,可以了解服务器的运行 ...

  3. Go的类型断言解析

    经常地我们对一个接口值的动态类型是不确定的,如方法的形参为接口类型时,此时就需要检验它是否符合我们需要的类型.类型断言是一个使用在接口值上的操作.断言类型的语法:x.(T),这里x表示一个接口的类型, ...

  4. Jsp分页的简单制作

    Jsp分页的简单制作 运行环境:jsp+tomcat+eclipse 技术:servlet+jsp+mysql 分页技术还区分两个:假分页和真分页 假分页:一次性从数据库读出表的所有数据一次性的返回给 ...

  5. jQuery.Gantt

    使用jQuery.Gantt过程中,遇到的问题!

  6. mysqli数据库连接

    /* * 连接数据库的mysqli函数库 * 使用的是过程化的风格编码 */header('content-type:text/html;charset=utf-8');// 获取数据库连接$link ...

  7. Java入门——(5)Java API

      关键词:String类.StringBuffer类.System类.Math类.Random类.Date类.Calendar类.DateFormat类   API (Application Pro ...

  8. android学习ViewFlipper的使用

    android系统自带的多页面管理控件,它可以实现子页面的自动切换 1,为ViewFlipper添加View 静态导入:在layout布局文件中直接导入 动态导入:通过addview方法进行导入 2, ...

  9. CSS3自定义滚动条样式

    原文地址:→传送门 写在前面 滚动条是个很常见的东东,不过某些浏览器自带的滚动条确实不太好看啊,下面可以作为学习,探讨下自定义滚动条的实现,这样你的滚动条就可以美美的啦.但是,也只能玩玩,因为只针对w ...

  10. Qt 无边框拖拽实现

    Qt 无边框拖拽实现 头文件定义: class TDragProxy:public QObject { Q_OBJECT public: TDragProxy(QWidget* parent); ~T ...