您的位置:首页 > 产品设计 > UI/UE

Android:UI更新方法一:Handler+View.invalidate+Thread+Runnable

2013-01-11 22:42 399 查看
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;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: