簡體   English   中英

ACTION_UP發生時停止線程

[英]Stopping a Thread when ACTION_UP occurs

我在使用線程時遇到了真正的麻煩。 簡單來說,我希望紅色方塊在觸摸時出現在屏幕上,而在沒有任何東西觸摸屏幕時消失。 我設法使它起作用。

現在,我正在嘗試實現它,以便在觸摸屏幕時出現紅色方塊,但隨后開始朝着手指移動。 我以為我會通過在觸摸屏幕時運行線程來更新正方形的X和Y坐標來做到這一點。 一旦讓線程在ACTION_DOWN和ACTION-UP上啟動和停止,我將嘗試這種方法。

我試圖實現僅打印到系統輸出的線程,並且在觸摸屏幕時會調用該線程,但是在我松開手指時不會停止。 我嘗試僅在布爾值為true時運行線程。 (這是在ACTION_DOWN發生時設置的。然后,我將ACTION_UP設置為false。

我在某處讀到它不起作用,因為該線程必須先完成才能停止,否則便會停止。 但是我不明白。

如果有人可以告訴我我要去哪里,並向我解釋它,將不勝感激。

package com.mr.mwood.thumbinput;

import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Align;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class MainActivity extends Activity {
    boolean screenIsBeingTouched = false;

    Thread th=new Thread(){ 
        @Override
        public void run(){
            while (screenIsBeingTouched == true) {
                 try {
                    Thread.sleep(2000);
                    System.out.println("Thread is running ");
                 } catch (InterruptedException e) {
                    e.printStackTrace();
                 }
            }
        }
    };

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(new SampleView(this));
    }

    class SampleView extends SurfaceView {

        int timer =0;
        private final SurfaceHolder surfaceHolder;
        private final Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);

        // CONSTRUCTOR
        public SampleView(Context context) {
            super(context);
            surfaceHolder = getHolder();
            paint.setColor(Color.RED);
            paint.setStrokeWidth(3);
        }

        @Override
        public boolean onTouchEvent(MotionEvent event) {   

            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:{
                    screenIsBeingTouched = true;
                    System.out.println("screenIsBeingTouched = true");
                    Canvas canvas = surfaceHolder.lockCanvas();
                    canvas.drawColor(Color.BLACK);
                    canvas.drawRect(30, 30, 80, 80, paint);
                    surfaceHolder.unlockCanvasAndPost(canvas);
                    th.start();
                    break;
                }
                case MotionEvent.ACTION_UP:{
                    screenIsBeingTouched = false;
                    System.out.println("screenIsBeingTouched = false");
                    Canvas canvas = surfaceHolder.lockCanvas();
                    canvas.drawColor(Color.BLACK);
                    surfaceHolder.unlockCanvasAndPost(canvas);
                    break;
                }
            }

            return true;
        }

    }   
}

只需在這里更新並嘗試

@Override
        public boolean onTouchEvent(MotionEvent event) {   

           //your code

            return false; // UPDATE HERE
        }

我為您提供一些提示:

  1. 您不應該那樣停止線程。 您應該使用th.interrupt()停止線程。 它將在睡眠時引發InterruptedException。 當您沒有睡眠時,應檢查isInterrupted()標志。
  2. 請記住,您將無法從與UI線程不同的線程中進行任何UI更改。 畢竟,您將不得不在Handler上發布一些Runnable來更新UI。 您實際上甚至不需要這個不同的線程。 您只能使用Handler.post + Handler.removeCallbacks解決所有問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM