나는 단지 몇 주 동안 자바를 사용 해왔다. 그리고 나는 무슨 일이 일어나는지 전혀 모른다.Android에서 스레딩. 무엇을 해야할지 모른다. 슈퍼 혼동
저는 캔버스를 만들고 있는데,이 코드를 튜토리얼에서 복사하여 붙여 넣었습니다. 그러나 실제로는 코드를 실제로 설정하는 방법을 모르기 때문에 발생하는 오류가 많습니다. 튜토리얼은 스레딩을하는 방법을 이미 알고있는 사람들을위한 것이며, 나는 길을 잃었다. 오류를 수정하는 방법을 모르겠습니다.
즉 :
postInvalidate()는 안드로이드 기능 ... setWillNotDraw 및 다른 사람과 같은 내장에도 불구하고, 또는 무엇인가 "하는 방법을 밤은."
저는 혼란스럽고 이러한 오류를 수정하는 방법을 모르겠습니다.
package com.example.routedrawingtest;
import android.graphics.Canvas;
import android.view.SurfaceHolder;
class PanelThread extends Thread {
private SurfaceHolder _surfaceHolder;
private DrawingPanel _panel;
private boolean _run = false;
public PanelThread(SurfaceHolder surfaceHolder, DrawingPanel panel) {
_surfaceHolder = surfaceHolder;
_panel = panel;
}
public void setRunning(boolean run) { //Allow us to stop the thread
_run = run;
}
@Override
public void run() {
Canvas c;
while (_run) { //When setRunning(false) occurs, _run is
c = null; //set to false and loop ends, stopping thread
try {
c = _surfaceHolder.lockCanvas(null);
synchronized (_surfaceHolder) {
postInvalidate();
}
} finally {
if (c != null) {
_surfaceHolder.unlockCanvasAndPost(c);
}
}
}
}
public void surfaceCreated(SurfaceHolder holder) {
setWillNotDraw(false); //Allows us to use invalidate() to call onDraw()
_thread = new PanelThread(getHolder(), this); //Start the thread that
_thread.setRunning(true); //will make calls to
_thread.start(); //onDraw()
}
public void surfaceDestroyed(SurfaceHolder holder) {
try {
_thread.setRunning(false); //Tells thread to stop
_thread.join(); //Removes thread from mem.
} catch (InterruptedException e) {}
}
위의 코드는 좋지 않다 부울 실행 변수가 필요 특정 설정으로는 가시성을 보장하기 위해 메모리 장벽의 일종으로 수행 할 수 있습니다. 변수를 휘발성으로 만드는 것이 가장 쉬운 방법입니다. – brain