[] invalidate()およびpostInvalidate()



Invalidate Postinvalidate



invalidate()はビューを更新するために使用され、UIスレッドで機能している必要があります。たとえば、ビューの表示を変更する場合は、invalidate()を呼び出して、再描画されたインターフェイスを表示します。 invalidate()呼び出しは、メインUIスレッドキューから古いビューをポップすることです。 Androidプログラムにはデフォルトで1つのプロセスしかありませんが、1つのプロセスの下に多数のスレッドが存在する可能性があります。このようなスレッドの中で、UIインターフェイスの表示、更新、および制御の相互作用の制御を主に担当するスレッドは、UIスレッドと呼ばれます。 onCreate()メソッドはUIスレッドによって実行されるため、UIスレッドはメインスレッドとしても理解できます。スレッドの残りの部分は、ワーカースレッドとして理解できます。
Invalidate()はUIスレッドで動員されます。ワーカースレッドでは、インターフェイスを更新するようにハンドラーからUIスレッドに通知できます。
そして、postInvalidate()がワーカースレッドで呼び出されます

まず、Handler.post(Runnable r)メソッドを調整します。RunnableはUIが配置されているスレッドで実行されるため、View.invalidate()を直接呼び出すことができます。


package com.ray.test

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)
mHandler = new Handler()
mHandler.post(new Runnable(){
@Override
public void run() {
myView.invalidate() // Handler.post(Runnable r) method, Runnable runs in the thread where the UI is located, so you can call View.invalidate() directly
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を更新します。直接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 {
myView.postInvalidate() // Update the UI in a new thread, you can directly postInvalidate() .
Thread.sleep(100)
} catch (InterruptedException e) {
Thread.currentThread().interrupt()
}
}
}
}