zoukankan      html  css  js  c++  java
  • 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)更好.

  • 相关阅读:
    Oracle 11g设置IP访问限制
    ORA-01940 无法删除当前已连接的用户之解决方案
    如何终止正在进行expdp导出数据的任务
    Oracle权限管理详解
    linux yum配置代理
    命令别名设置: alias, unalias
    Linux 桌面双击运行脚本
    变量内容的删除、取代与替换 (Optional)
    linux查看和修改PATH环境变量的方法
    文件系统及程序的限制关系: ulimit
  • 原文地址:https://www.cnblogs.com/LCX/p/4483102.html
Copyright © 2011-2022 走看看