SurfaceViewを拡張するGraphicViewがあります。グラフィックを描くために必要です。onTouchEventも必要です。しかし、問題は...私はそれを説明する方法がわかりません:)ここに私のコードがあります:
public class GraphicView extends SurfaceView implements Runnable {
private boolean mutexOpened = true;
public boolean onTouchEvent( MotionEvent me ) {
if ( mutexOpened ) {
mutexOpened = false;
Log.d( "mutex", "ACTION 1" );
switch ( action ) {
case MotionEvent.ACTION_DOWN: {
int rnd = new Random().nextInt( 40000 ) + 1000;
for ( int i = 0; i < rnd; i++ ) {} // it's some long action :)
Log.d( "mutex", "ACTION 2: down" );
break;
}
}
Log.d( "mutex", "ACTION 2: end" );
mutexOpened = true;
}
}
public void run() {
while ( true ) {
if ( mutexOpened ) {
Log.d( "mutex", "!!! RUN !!!!" );
}
}
}
}
私は(私が思うに)スレッドを制御しなければならないミューテックス技術を使用しています。しかし、ログには次のように表示されます。
!!! RUN !!!!
ACTION 1
!!! RUN !!!!
ACTION 2: down
ACTION 2: end
しかし、なぜ??なぜ2番目の「!!!RUN!!!!」ミューテックスが閉じているときに「アクション1」と「アクション2」の間で実行されますか?それは不可能だ!:)))
私は次にやろうとしました:
public void run() {
while ( true ) {
if ( mutexOpened ) {
mutexOpened = false; // close mutex
Log.d( "mutex", "!!! RUN !!!!" );
mutexOpened = true; // open mutex
}
}
}
しかし...失敗:))onTouchEventはまったく実行されません:D)))誰かがこの問題を解決する方法を知っていますか?