• android 子线程更新UI


    参考http://examples.javacodegeeks.com/android/core/os/handler/android-handler-example/
    package
    com.example.test1; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.os.Message; import android.util.Log; import android.widget.Button; import android.widget.ProgressBar; /* * 使用Handler更新UI * */ public class MyHandlerActivity2 extends Activity { Button button; ProgressBar bar; Handler myHandler; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button = (Button) findViewById(R.id.startButton); bar=(ProgressBar) findViewById(R.id.bar); new Thread(MyThread).start(); // 当创建一个新的Handler实例时, 它会绑定到当前线程和消息的队列中,开始分发数据 // Handler有两个作用, (1) : 定时执行Message和Runnalbe 对象 // (2): 让一个动作,在不同的线程中执行. // 它安排消息,用以下方法 // post(Runnable) // postAtTime(Runnable,long) // postDelayed(Runnable,long) // sendEmptyMessage(int) // sendMessage(Message); // sendMessageAtTime(Message,long) // sendMessageDelayed(Message,long) // 以上方法以 post开头的允许你处理Runnable对象 //sendMessage()允许你处理Message对象(Message里可以包含数据,) myHandler = new Handler(){ public void handleMessage(Message msg) { // TODO Auto-generated method stub Log.d("MyHandler", "handleMessage......"); //super.handleMessage(msg); // 此处可以更新UI Bundle b = msg.getData(); int value = b.getInt("value")*10; MyHandlerActivity2.this.bar.setProgress(value); } }; //myHandler.postDelayed(MyThread, 1500); //myHandler.post(MyThread);//并没有启动新线程 } Runnable MyThread =new Runnable() { public void run() { for (int i = 0; i <= 10; i++) { try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } Log.d("thread.......", "mThread........"); Message msg = new Message(); Bundle b = new Bundle();// 存放数据 b.putInt("value", i); msg.setData(b); //myHandler.sendMessage(myHandler.obtainMessage());//发送的都是0 myHandler.sendMessage(msg); // 向Handler发送消息,更新UI } //myHandler.removeCallbacks(MyThread); } }; }

    方法2

    package com.example.test1;
    import android.app.Activity;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Looper;
    import android.os.Message;
    import android.util.Log;
    import android.widget.Button;
    import android.widget.ProgressBar;
    /*
     * 使用Handler更新UI
     * */
    public class MyHandlerActivity2 extends Activity {
        Button button;
        ProgressBar bar;  
        Handler myHandler;
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            button = (Button) findViewById(R.id.startButton);
            bar=(ProgressBar) findViewById(R.id.bar);
            new Thread(MyThread).start();
            // 当创建一个新的Handler实例时, 它会绑定到当前线程和消息的队列中,开始分发数据
            // Handler有两个作用, (1) : 定时执行Message和Runnalbe 对象
            // (2): 让一个动作,在不同的线程中执行.
            // 它安排消息,用以下方法
            // post(Runnable)
            // postAtTime(Runnable,long)
            // postDelayed(Runnable,long)
            // sendEmptyMessage(int)
            // sendMessage(Message);
            // sendMessageAtTime(Message,long)
            // sendMessageDelayed(Message,long)
            // 以上方法以 post开头的允许你处理Runnable对象
            //sendMessage()允许你处理Message对象(Message里可以包含数据,)
            myHandler = new Handler(){
                public void handleMessage(Message msg) {
                    // TODO Auto-generated method stub
                    Log.d("MyHandler", "handleMessage......");
                    //super.handleMessage(msg);
                    // 此处可以更新UI
                    Bundle b = msg.getData();
                    int value = b.getInt("value")*10;
                    MyHandlerActivity2.this.bar.setProgress(value);
                }
            };
            //myHandler.postDelayed(MyThread, 1500);
            //myHandler.post(MyThread);//并没有启动新线程
        }
        Runnable MyThread =new  Runnable() {
            public void run() {
                for (int i = 0; i <= 10; i++) {        
                    final int value=i;
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    myHandler.post(new Runnable() {
                        
                        @Override
                        public void run() {
                            //Cannot refer to a non-final variable value inside an inner class defined in a different method
                            //因此value要设置为final
                            bar.setProgress(value*10);
                        }
                    });
                }
            }
        };
    }

  • 相关阅读:
    C# for VS foreach 性能对比
    C# D3D中2D的使用,做小游戏。。。。半年前写的东西了,拿出来分享,现在看来代码写的乱七八糟的,将就一下吧。。。
    传奇3(G) 国际服 地图 显示 C#代码实现(地表草皮显示基本没有问题,但地面对象显示混乱)
    IE6和Opera position:absolute; 子元素浮动 width:100%;显示不正确问题。。。
    .NET Framework 4 文件IO读写的增强 激动人心的强大 或许正是你所期待的 基类库中的新增内容 转自msdn杂志
    VirtualBox 系统盘 虚拟磁盘 变大?
    假如你是ASP.NET 中手,个团队邀请你加入他们,没有工资(至少要等到项目卖出去,交付)[问题点数:100分] 创业号召贴,发帖保存
    对于C#的一些奢望(对微软的一种幻想,对ASP.NET,WEB,计算机,.NET,以及一些现状的抱怨)
    实例化 泛型 对象
    基于权值的微博用户采样算法研究
  • 原文地址:https://www.cnblogs.com/cart55free99/p/3382710.html
Copyright © 2020-2023  润新知