Android:UI更新方法一:Handler+View.invalidate+Thread+Runnable
2013-01-11 22:42
399 查看
Android单线程模型:Android UI操作并不是线程安全的,并且这些操作必须在UI线程中执行。不能直接在工作线程更新UI。
自定义一个VIew:
主代码:
自定义一个VIew:
package com.example.updateui; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.util.AttributeSet; import android.util.Log; import android.view.View; public class MyView extends View { private static final String TAG = MyView.class.getSimpleName(); private int mCount = 0; public MyView(Context context) { super(context); // TODO Auto-generated constructor stub } public MyView(Context context,AttributeSet attrSet) { super(context,attrSet); // TODO Auto-generated constructor stub } @Override public void onDraw(Canvas canvas) { Log.i(TAG,"onDraw"); if (mCount < 100) { mCount++; } else { mCount = 0; } // 绘图 Paint paint = new Paint(); switch (mCount % 4) { case 0: paint.setColor(Color.BLACK); break; case 1: paint.setColor(Color.RED); break; case 2: paint.setColor(Color.BLUE); break; case 3: paint.setColor(Color.YELLOW); break; } // 绘图 canvas.drawRect(this.getLeft(), this.getTop(), this.getRight(), this.getBottom(), paint); Log.i(TAG,"drawRect count:"+mCount); } }
主代码:
package com.example.updateui; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.app.Activity; import android.view.Menu; import android.view.Window; public class MainActivity extends Activity { private MyView mView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.requestWindowFeature(Window.FEATURE_NO_TITLE); mView = new MyView(this); setContentView(mView);//需要绑定到window,invalidate有效 new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub while (!Thread.currentThread().isInterrupted()) { //发送消息到Handler(Handler包含了主UI线程的looper和消息队列) Message message = new Message(); message.what = 1; MainActivity.this.mHandler.sendMessage(message); try { Thread.sleep(1000); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } } }).start(); // setContentView(R.layout.activity_main); } //注册一个Handler接收消息 private Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case 1: mView.invalidate();//直接刷新UI,只能在UI线程调用invalidate break; } super.handleMessage(msg); } }; @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_main, menu); return true; } }
相关文章推荐
- Android:UI更新方法二:View.postInvalidate+Thread+Runnable
- Android 更新UI的两种方法——handler和runOnUiThread()
- Android 更新UI的两种方法——handler和runOnUiThread()
- Android 更新UI的两种方法——handler和runOnUiThread()
- Android更新UI的两种方法——handler与runOnUiThread()
- Android更新UI的两种方法——handler与runOnUiThread()
- Android 更新UI的两种方法——handler和runOnUiThread()
- Android 更新UI的两种方法——handler和runOnUiThread()
- Android开发中更新UI时runOnUIthread(Runnable)与Handler.post(Runnable)的区别及如何选择
- Android 更新UI的两种方法——handler和runOnUiThread()
- Android 更新UI的两种方法——handler和runOnUiThread(
- Android 更新UI的两种方法——handler和runOnUiThread()
- Android:UI更新方法三:Handler+Worker Thread
- 子线程更新UI会发生android.view.ViewRoot$CalledFromWrongThreadException异常的解决方法
- 子线程更新UI会发生android.view.ViewRoot$CalledFromWrongThreadException异常的解决方法
- Android 更新UI的两种方法——handler和runOnUiThread()
- Android 更新UI的两种方法——handler和runOnUiThread()
- Android 更新UI的两种方法——handler和runOnUiThread()
- Android 更新UI的两种方法——handler和runOnUiThread()
- 『ANDROID』 在Android开发过程中,常Android 更新UI的两种方法——handler和runOnUiThread()