Android:UI更新方法一:Handler+View.invalidate+Thread+Runnable
Android单线程模型:Android UI操作并不是线程安全的,并且这些操作必须在UI线程中执行。不能直接在工作线程更新UI。
自定义一个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;
- }
- }

浙公网安备 33010602011771号