閱讀830 返回首頁    go 阿裏雲 go 技術社區[雲棲]


Handler更新UI的幾種方法

handler使用Message

1.定義一個Handler

2.重寫消息處理函數

3.發送消息

//創建簡單的View
import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.graphics.Point; 
import android.graphics.drawable.Drawable; 
import android.view.View; 

public class BounceView extends View { 
float x = 40; 

public BounceView(Context context) {  
super(context);  
}  

@Override  
protected void onDraw(Canvas canvas) {  
x+=10; 
Paint mPaint = new Paint(); 
mPaint.setAntiAlias(true); 
mPaint.setColor(Color.GREEN); 
canvas.drawCircle(x, 40, 40, mPaint); 

//創建Activity
import android.app.Activity; 
import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.os.Bundle; 
import android.os.Handler; 
import android.os.Message; 
import android.view.View; 
import android.view.Window; 

public class TestHandler extends Activity { 
protected static final int GUIUPDATEIDENTIFIER = 0x101;  

Thread myRefreshThread = null;  
BounceView myBounceView = null;  
//1.定義一個Handler(一般更新View)
Handler myHandler = new Handler() { 
//2.重寫消息處理函數
public void handleMessage(Message msg) {  
switch (msg.what) {  
//判斷發送的消息
case TestHandler.GUIUPDATEIDENTIFIER:  
//更新View
myBounceView.invalidate(); 
break;  
}  
super.handleMessage(msg);  
}  
}; 
public void onCreate(Bundle savedInstanceState) {  
super.onCreate(savedInstanceState);  
this.requestWindowFeature(Window.FEATURE_NO_TITLE);  

this.myBounceView = new BounceView(this); 
this.setContentView(this.myBounceView);  
new Thread(new myThread()).start(); 
}  

class myThread implements Runnable {  
public void run() { 
while (!Thread.currentThread().isInterrupted()) {   
//3.發送消息
Message message = new Message();
//發送消息與處理函數裏一致 
message.what = TestHandler.GUIUPDATEIDENTIFIER;  
//內部類調用外部類的變量
TestHandler.this.myHandler.sendMessage(message); 

try {  
Thread.sleep(100);   
} catch (InterruptedException e) {  
Thread.currentThread().interrupt();  
}  
}  
}  
}  

利用handler.post()更新UI

1.創建一個Handler 2.調用Handler.post(Runnable r)方法 3.Runnable運行在UI所在線程,所以可以直接調用View.invalidate()

import android.app.Activity; 
import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.os.Bundle; 
import android.os.Handler; 
import android.view.View; 

public class TestHandler extends Activity { 
private MyView myView; 
private Handler mHandler; 
public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
myView = new MyView(this); 
//創建一個Handler
mHandler = new Handler();
//調用Handler.post(Runnable r)方法
mHandler.post(new Runnable(){ 
@Override 
public void run() { 
//直接調用View.invalidate(),更新組件
myView.invalidate(); 
//延遲5毫秒後執行線程
mHandler.postDelayed(this, 5); 

}); 
setContentView(myView); 

class MyView extends View{ 
private float x = 0f; 
public MyView(Context context) { 
super(context); 


protected void onDraw(Canvas canvas) { 
super.onDraw(canvas); 
x+=1; 
Paint mPaint = new Paint(); 
mPaint.setColor(Color.BLUE); 
canvas.drawRect(x, 40, x+40, 80, mPaint); 


在線程裏直接更新UI

//在新線程裏更新UI,可以直接使用postInvalidate()

public void onCreate(Bundle savedInstanceState) {     
super.onCreate(savedInstanceState);     
this.requestWindowFeature(Window.FEATURE_NO_TITLE);     

myView = new MyView(this); 
this.setContentView(this.myView);     
new Thread(new myThread()).start();    
}     

class myThread implements Runnable {     
public void run() {    
while (!Thread.currentThread().isInterrupted()) {     
try { 
//更新UI
myView.postInvalidate();  
Thread.sleep(100);      
} catch (InterruptedException e) {     
Thread.currentThread().interrupt();     
}     
}     
}     
}

最後更新:2017-04-02 06:51:49

  上一篇:go 用ExpandableListView實現類似QQ好友列表
  下一篇:go Java 多線程的Thread類和Runnable接口