private volatile boolean mStopped = false;
private int i;
TextView tv1;
TextView tv2; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main3); tv1 = (TextView) findViewById(R.id.tv1);
tv2 = (TextView) findViewById(R.id.tv2); Button button4 = (Button) findViewById(R.id.button4); //获取“开始”按钮
Button button5 = (Button) findViewById(R.id.button5); //获取“停止”按钮 //开始按钮
button4.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if( mStopped = true) {
mStopped = false;
Log.i("主线程ID", String.valueOf(Thread.currentThread().getId()));
Log.i("主线程var", String.valueOf(Thread.currentThread().getName())); fgetsum(String.valueOf("mytv1"), 1);
fgetsum(String.valueOf("mytv2"), 2);
}
}
}); //结束线程按钮
button5.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mStopped = true;
}
}); } //定义Handler 消息处理类,Handler 允许发送和处理 Message 或 Rannable 对像到其所在线程的 MessageQueue中
//Handler接收Message通知,并刷新tv1
//一般在这里刷新UI
final Handler handler2 = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what){
case 0x101:
tv1.setText(String.valueOf(msg.obj.toString()));
break;
case 0x102:
tv2.setText(String.valueOf(msg.obj.toString()));
break;
default:
tv1.setText(String.valueOf("未知msg.what"));
break;
} }
}; //定义Runnable接口
//在子线程中发送Message给Handler
//Runnable不会在UI运行,所以在这里不能直接修改UI对象属性
private void fgetsum(final String strname, final int tvid) {
Thread thread = new Thread() {
@Override
public void run() { while (mStopped == false) {
i++;
try {
Thread.sleep(1000);
Log.i("子线程ID" + strname, String.valueOf(Thread.currentThread().getId()));
Log.i("子线程名" + strname, String.valueOf(Thread.currentThread().getName())); Message message = handler2.obtainMessage();
message.arg1 = tvid;
//如果tvid=1传入时间,否则传入i
if(tvid==1){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss", Locale.getDefault());
message.what=0x101;
message.obj = String.valueOf(sdf.format(new Date()));
}else{
message.what=0x102;
message.obj =i;
} handler2.sendMessage(message);
} catch (InterruptedException e) {
e.printStackTrace();
}
} }
};
thread.start();
thread = null;
}

Android 跟winform一样,,主线程上不能直接更新UI上的控件,否则界面会假死(比如进度条、下载等任务)

在ASP.NET下有BackgroundWorker,而Android一般用Handler+Thread+Message来实现,对于用惯了.net的人说,看JAVA程序会很不习惯,很多功能实现起来比.NET麻烦多了。。。。。

另外查了一下JAVA资料,如果要创建N个线程,建议用线程序池(ExecutorService)更好.

Android 子线程测试的更多相关文章

  1. Android子线程更新UI成功

    android子线程更新UI成功 今天在写demo的时候,在子线程中更新UI,发现更新成功,记录一下. protected void onCreate(Bundle savedInstanceStat ...

  2. Android子线程真的不能更新UI么

    Android单线程模型是这样描述的: Android UI操作并不是线程安全的,并且这些操作必须在UI线程执行 如果在其它线程访问UI线程,Android提供了以下的方式: Activity.run ...

  3. Android 子线程 UI 操作真的不可以?

    作者:vivo 互联网大前端团队- Zhang Xichen 一.背景及问题 某 SDK 有 PopupWindow 弹窗及动效,由于业务场景要求,对于 App 而言,SDK 的弹窗弹出时机具有随机性 ...

  4. Android子线程更新UI的方法总结

    版权声明:本文为博主原创文章,转载请注明出处:https://i.cnblogs.com/EditPosts.aspx?postid=6121280 消息机制,对于Android开发者来说,应该是非常 ...

  5. Android子线程更新UI主线程方法之Handler

    背景: 我们开发应用程序的时候,处于线程安全的原因子线程通常是不能直接更新主线程(UI线程)中的UI元素的,那么在Android开发中有几种方法解决这个问题,其中方法之一就是利用Handler处理的. ...

  6. Android 子线程中进行UI操作遇到的小问题

    今天在学习<第一行Android代码>第9章-子线程进行UI操作时遇到了一些问题. 代码是这样的: ... import java.util.logging.Handler; ... pu ...

  7. Android子线程更新主界面

    学习什么的还是要真正的有应用,有需求才能在最短的时间里面牢牢掌握一项技术. 今天就是这样的,产品一个需求下来,十万火急啊.然后之前只稍稍接触过,只能硬着头皮上了.最后牢牢地掌握了最简单的Handler ...

  8. 老问题:Android子线程中更新UI的3种方法

    在Android项目中经常有碰到这样的问题,在子线程中完成耗时操作之后要更新UI,下面就自己经历的一些项目总结一下更新的方法: 方法一:用Handler 1.主线程中定义Handler: Handle ...

  9. Android:子线程向UI主线程发送消息

    在Android里,UI线程是不同意被堵塞的.因此我们要将耗时的工作放到子线程中去处理. 那么子线程耗时处理后要如何通知UI线程呢? 我们能够在UI主线程中创建一个handler对象,然后通过重写其h ...

随机推荐

  1. 将bean转换成键值列表

    日常开发中在进行接口对接的数据传输时,有一种场景是将bean转成jsonString,这里可以将bean转换成Map再转成jsonString. 工具类如下: public static String ...

  2. Quartz作业调度框架及时间表达式的含义和语法

    Quartz 是一个开源的作业调度框架,它完全由 Java 写成,并设计用于 J2SE 和 J2EE 应用中.它提供了巨大的灵活性而不牺牲简单性.你能够用它来为执行一个作业而创建简单的或复杂的调度.本 ...

  3. asp.net mvc 在视图中获取控制器与动作的名称

    获取 controller 名称: ViewContext.RouteData.Values["controller"].ToString(); 获取 action 名称: Vie ...

  4. js、css引用文件的下载方式

    js.css引用文件的下载方式 一.测试(chrome):1.直接使用<script...>.<link...>标签来混合引入脚本文件和css文件, <script as ...

  5. JQuery中的选择器的总结

    JQuery的选择器十分的强大,但是我平常经常用到的却十分的有限,趁现在有时间我感觉有必要总结一下. 基本选择器 $("#ID") 选择ID所对应的标签元素 返回一个标签元素$(& ...

  6. Oracle知识分类之异常

    Oracle异常分类                                                                                           ...

  7. kaggle实战记录 =>Digit Recognizer

    date:2016-09-13 今天开始注册了kaggle,从digit recognizer开始学习, 由于是第一个案例对于整个流程目前我还不够了解,首先了解大神是怎么运行怎么构思,然后模仿.这样的 ...

  8. php构造方法与析构方法

    1. 构造方法 <?php //构造方法 __construct() 是在实例化对象时被自动调用 //用途:可以用于初始化程序(可以给成员属性赋值,也可以调用成员方法) //语法:[修饰符] f ...

  9. rbd snap(1)

    来自官方文档: 快照介绍 快照是映像在某个特定时间点的一份只读副本. 对当前镜像打过快照以后,Active层仍在当前镜像,快照文件为只读. Note 如果在做快照时映像仍在进行 I/O 操作,快照可能 ...

  10. C#通过SSH连接MySql

    出于安全考虑,有的时候数据库服务器只能通过SSH访问,比如MySql服务装在了服务器A上,并且A机器只允许B机器才能访问,而部署环境可能在C机器上,这时候就要C服务器通过B服务器连接A服务器,这时候就 ...