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

更多相关文章

  1. Android 5.0新控件 FloatingActionButton | 悬浮按钮 介绍及使用
  2. 防止Android点击按钮过快造成多次事件实现原理
  3. Android中RadioGroup RadioButton CheckBox多选按钮实现方法以及
  4. Android 怎么防止AlertDialog Button按钮字母变大写
  5. Android Handler:子线程发消息到UI主线程
  6. android 按钮置灰效果
  7. listview 左滑弹出删除按钮,需要折腾一下

随机推荐

  1. Android中关于RatingBar设置只显示实心星
  2. 网易HubbleData之Android无埋点实践
  3. Android应用资源---绘制资源类型(Drawable
  4. 转:Android.自定义控件的实现
  5. Android下从网络上获取图片的方法 学习笔
  6. Android(安卓)- 开发实例(15):变色SystemB
  7. 产品必懂的技术必修(三)
  8. Android开机启动的那些事
  9. Android之高仿微信聊天的界面
  10. Android(安卓)编译命令