码迷,mamicode.com
首页 > 其他好文 > 详细

更新UI

时间:2015-08-27 15:35:54      阅读:159      评论:0      收藏:0      [点我收藏+]

标签:

1、Handler+sendMessage+Thread方法

public class UpdateUIActivity extends Activity
{
	private TextView mTextView;

	@Override
	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_update_ui);
		mTextView = (TextView) findViewById(R.id.textView1);
	}
	
	//使用handler的线程类
	public class MyHandler implements Runnable
	{
		private Handler mHandler;
		//handler对象会通过构造方法的参数将传入线程类
		public MyHandler(Handler handler)
		{
			mHandler = handler;
		}

		@Override
		public void run()
		{
			Message message = new Message();
			//通过Message对象想handler传递更新的内容
			message.obj = "Handler";
			//通过handler更新TextView控件的内容
			mHandler.sendMessage(message);//这句话负责把message方法中的代码引用压入主线程的执行堆栈中
		}
	}
	//实例化用于更新TextView控件的handler对象
	Handler mHandler = new Handler()
	{
		@Override
		public void handleMessage(Message msg)
		{
			//从Message对象获取要更新的文本
			String str = String.valueOf(msg.obj);
			//更新TextView控件的显示内容(成功更新)
			mTextView.setText(str);

		}
		
	};
	//“使用handler”按钮的单击事件方法
	public void onClick_Handler(View view)
	{
		//创建线程
		Thread thread = new Thread(new MyHandler(mHandler));
		//开启线程,并成功更新TextView控件的显示内容
		thread.start();
	}

}

步骤:

1、创建自己的mHandler类,并实现Runnable接口的run方法

2、在run方法里面创建Message对象,并设置相关的字段,此处是message.obj,用于传递更新UI的参数,如果更新UI的参数是一组数据,可以使用Bundle,eg:

            Message msg = new Message();  

            Bundle bundle = new Bundle();  

            bundle.putString("xxx", "string");  

            bundle.putInt("yyy","int");

            msg.setData(bundle);

            mHandler.sendMessage(message);//这句话负责把message方法中的代码引用压入主线程的执行堆栈中

3、实例化mHandler对象,

Handler mHandler = new Handler()

然后在handleMessage方法里面相应的跟新UI操作

4、开启线程

    Thread thread= new Thread(new MyHandler(mHandler));//关键,把thread,MyHandler联系在一起,

     thread.start();

小结:以上是比较完整的使用子线程sendMessage方式的代码,实际应用过程里面,会使用分别继承Handler和Thread的方式,例如:

public class MainActivity extends Activity {

	private EditText UITxt;  
    private Button updateUIBtn;  
    private UIHandler UIhandler;  
  
    @Override  
    public void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
        UITxt = (EditText)findViewById(R.id.ui_txt);  
        updateUIBtn = (Button)findViewById(R.id.update_ui_btn);  
        updateUIBtn.setOnClickListener(new View.OnClickListener() {  
              
            public void onClick(View v) {  
                // TODO Auto-generated method stub  
                UIhandler = new UIHandler();  
                UIThread thread = new UIThread();  
                thread.start();  
            }  
        });  
    }  
  
    
    private class UIHandler extends Handler{  
        @Override  
        public void handleMessage(Message msg) {  
        	// 更新UI的代码
            // TODO Auto-generated method stub  
            super.handleMessage(msg);  
            Bundle bundle = msg.getData();  
            String color = bundle.getString("color");  
            UITxt.setText(color);  
        }  
    }  
    private class UIThread extends Thread{  
        @Override  
        public void run() {  
            try {  
                Thread.sleep(3000);  
            } catch (InterruptedException e) {  
                // TODO Auto-generated catch block  
                e.printStackTrace();  
            }  
            Message msg = new Message();  
            Bundle bundle = new Bundle();  
            bundle.putString("color", "黄色");  
            msg.setData(bundle);  
            MainActivity.this.UIhandler.sendMessage(msg);  
              
        }  
    }  
}

小结: 继承Handler,在sendMessage方法里面获取msg传递过来的数据,进行UI更新的操作

         继承Thread,在run方法里面创建Message对象msg,并传入参数,发送msg

        如何使用该子线程和之前提到的方法是一样的。


2、Runnable+post+Thread方法

public void onClick(View view)
{
    //创建子线程
    new Thread(new Runnable()
    {
    public void run()
        {
        final Bitmap bitmap=loadImageFromNetwork("http://example.com/image.png");
        //mImageView 是UI线程创建的ImageView对象,在另一个线程中使用post方法
        mImageView.post(new Runnable()
            {
            public void run()
                {
                mImageView.setImageBitmap(bitmap);
                }
            })
        }
    }
    ).start();
}

小结:使用post方式,需要在对应的控件调用post方法,好处是使用简便,

3、runOnUiThread方法

Thread th = new Thread() {
			@Override
			public void run() {
				try {
					Thread.sleep(100);
					runOnUiThread(new Runnable() {
						@Override
						public void run() {
							try {
								// 更新UI
								text.setText("xxx");
							} catch (Exception e) {
								e.printStackTrace();
							}
						}
					});

				} catch (InterruptedException e) {
				}
			}
		};
		th.start();

套两层Runnable是其特征,在最里面的run函数里面写更新UI的代码




更新UI

标签:

原文地址:http://my.oschina.net/carbenson/blog/497917

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!