Android 子线程测试

    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)更好.

时间: 2024-10-06 23:32:14

Android 子线程测试的相关文章

android子线程中更新UI的方法

在Android项目中经常有碰到这样的问题,在子线程中完成耗时操作之后要更新UI,下面就自己经历的一些项目总结一下更新的方法: 参考:Android子线程 方法一:用Handler 1.主线程中定义Handler: Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case 0: //

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

背景: 我们开发应用程序的时候,处于线程安全的原因子线程通常是不能直接更新主线程(UI线程)中的UI元素的,那么在Android开发中有几种方法解决这个问题,其中方法之一就是利用Handler处理的. 下面说下有关Handler相关的知识. 多线程一些基础知识回顾:在介绍Handler类相关知识之前,我们先看看在Java中是如何创建多线程的方法有两种:通过继承Thread类,重写Run方法来实现通过继承接口Runnable实现多线程 具体两者的区别与实现,看看这篇文章中的介绍:http://de

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

Android单线程模型是这样描述的: Android UI操作并不是线程安全的,并且这些操作必须在UI线程执行 如果在其它线程访问UI线程,Android提供了以下的方式: Activity.runOnUiThread(Runnable) View.post(Runnable) View.postDelayed(Runnable, long) Handler 为什么呢?在子线程中就不能操作UI么? 当一个程序第一次启动的时候,Android会同时启动一个对应的主线程,这个主线程就是UI线程,也

android 子线程真的不能更新ui吗

在实际的开发中,子线程肯定是不能更新ui的,但是在测试的代码中,我们可以实现子线程中更新ui的功能,例如:一个textview 在oncreate生命周期方法中进行findviewbyid 然后紧接着写一个线程,在线程中直接对这个textview进行settext,你就会发现奇迹竟然就那么发生了,竟然真的更新了ui,而app竟然没有cresh掉,顿时就惊呆了 然后分别尝试在onstart onresume 方法中进行子线程更新ui的操作,竟然都可以更新,但是此时有一个地方需要注意,当我们程序的o

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

在Android里,UI线程是不允许被阻塞的,因此我们要将耗时的工作放到子线程中去处理. 那么子线程耗时处理后要怎样通知UI线程呢? 我们可以在UI主线程中创建一个handler对象,然后通过重写其handleMessage(Message msg)的方法,该方法会接收到子线程中的handler对象的sendMessage((Message msg)发回来的消息.这样一发一收就完成工作: 而关于主线程向子线程发送消息的内容可以看我的上一篇博客,其中讲到了Looper类及其两个重要方法和实现原理.

Android子线程更新主界面

学习什么的还是要真正的有应用,有需求才能在最短的时间里面牢牢掌握一项技术. 今天就是这样的,产品一个需求下来,十万火急啊.然后之前只稍稍接触过,只能硬着头皮上了.最后牢牢地掌握了最简单的Handler技术,闲话不多说了! 每一个做android的人都知道,android的内存可谓是存M存金啊!然后我们自然知道,而且Google在设计的时候也充分的考虑到了这一点,所以,我们的UIThread里面一般不做耗时的工作,比如请求网络,比如执行一些比较耗时的逻辑,比如比如加载图片,比如,哦,暂时只碰到过这

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

在Android项目中经常有碰到这样的问题,在子线程中完成耗时操作之后要更新UI,下面就自己经历的一些项目总结一下更新的方法: 方法一:用Handler 1.主线程中定义Handler: Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case 0: //完成主界面更新,拿到数据 S

Android 子线程 更新 UI 界面 总结

package com.jrhcode.morethreadtest; import java.util.concurrent.Executors; import android.os.AsyncTask; import android.os.Bundle; import android.os.Handler; import android.app.Activity; import android.view.Menu; import android.widget.TextView; import

Android 子线程更新UI 异常

众所周知,Android是不可以在子线程中直接更新UI的,需要借助Handler或者View.post(Runnable runnable)或者runOnUIThread(Runnable runnable)将更新的代码切入到主线程中去实现UI更新. 我们来试一下,在Activity的 onCreate中直接在新线程中去更新一个TextView的文本,结果发现,WHAT?竟然没有抛出异常,更新也成功了? 这是因为在onCreate中尚未完成View的绘制,此时TextView中有个变量mLayo