2012-01-08 5 views
2

안녕하세요, 여기 자바와 안드로이드로 며칠 있습니다. 나는이 "실행 가능한 구현"정확히 방법에 대해 조금 혼란 스러워요 실제로 예를 작동 : 내가 물어 당황"runpleable implements runnable"에 대해 혼란스러워합니다.

public class DrawableSurfaceView extends SurfaceView implements Runnable { 

[...] 

public void resume(){ 
    isRunning = true; 
    mThread = new Thread(this); 
    mThread.start(); //start the animation 
    parseParameters(); //<== Here is my problem 
} 

public void run() { 
    while (isRunning == true){ 
     if (!mHolder.getSurface().isValid()) { 
     continue; 
     } 
     Canvas canvas = mHolder.lockCanvas(); 
     canvas.drawARGB(255, 0, 0, 0); 
     canvas.drawPath(PenPath, PenPaint); 
     canvas.drawPath(CursorPath, CursorPaint); 
     mHolder.unlockCanvasAndPost(canvas); 
    } 
} 
public void parseParameters() { 
    [...] 
    [ The rest of my code here modifying PenPath and CursorPath, etc ] 

} 

,하지만 난 그 mThread.start 후() 생각; run 메서드에서 루프를 실행하여 새 스레드가 시작됩니다. 대신에 내 parseParameters() 메소드가 종료 된 후에 만 ​​실행되는 run 메소드가있다. 내가 원하는 것은 드로잉 루프 스레드에 캔버스를두고 드로잉 경로의 매개 변수를 외부에서 수정하여 애니메이션을 생성하는 것입니다. 이것은 매우 기본적인 것이라고 확신하지만 몇 시간 동안 이것을 이해할 수 없었습니다. 문서가 도움이되지 않습니다.

모든 포인터가 도움이 될 것입니다. 건배!

답변

0

이 상황에서 어떤 종류의 루프도 직접 구현하지 않으려는 것 같습니다. 사용자 정의보기에서 onDraw(Canvas canvas)을 무시하고 싶을 것입니다. 이를 통해 어디에서든지 invalidate()을 호출하여 onDraw를 호출 할 수 있습니다. 외부 소스로부터 매개 변수를 받아 들일 수도 있습니다.

6

implements Runnable의 의미는이 클래스가 Runnable 인터페이스에 정의 된 메소드에 반응하고 그 결과가 Thread의 생성자에 전달 될 수 있다는 것입니다.

이제 새 스레드가 즉시 실행되지 않으며 시스템이 다른 스레드의 컨텍스트로 전환하기 전에 현재 스레드가 일부 기능을 계속 실행할 가능성이 있습니다.

+0

빠른 응답을 보내 주셔서 감사합니다. 스레드가 즉시 시작된다는 보장이 없다는 것을 깨달았습니다. 그래서 run() 메소드가 실행되고 부울이 바뀔 때까지 루프와 부울로 다른 메소드를 잠그려고했습니다. 그러나 Run() 메서드는 절대 실행되지 않으므로 루프가 무한히 진행됩니다. 멍청한 질문에 대해 유감스럽게도, 아직받지 못하고 있습니다. –

+0

isRunning'volatile'을 시도해보고, 그 값을 어디에서 false로 변경합니까? 나는 당신의 코드에서 그것을 보지 못했습니다. – MByD

+0

죄송합니다. 전 전체 코드를 복사하지 않았습니다. 휘발성으로 만들려고합니다. –

5

mThread.start();은 Java (및 OS)에게 스레드의 실행 자격을 알립니다. 스레드가 바로 시작된다는 보장은 없습니다. 실제로, 특히 싱글 코어 시스템에서 스레드는 다음에 OS가 점프하고 작업/스레드를 전환 할 때까지 실행되지 않는 경우가 많으므로 실제로 시작할 때 실제로 "좋아할 때"시작할 수 있습니다 ".

3

Class X ... implements Runnable 단 하나의 일, 즉 X가 Runnable 인터페이스가 말하는 것을 제공한다는 것을 약속하십시오. 즉, X가 계약을 준수한다는 표시입니다. Java 인터페이스 (여기 Runnable)가 있습니다.

Runnable의 경우 계약서에서 말하는 유일한 것은 X가 void run() 메소드를 제공한다는 것입니다.

여기에있는 속임수는 Thread 생성자가 Runnable을 요구한다는 것을 인식하므로 호출 할 run() 메서드가 있는지 확인할 수 있습니다. 새 스레드가 시작되면 이제 프로그램에 두 개의 장소가 발생합니다. 작업을 올바르게 할당해야하므로 올바른 스레드에서 발생합니다.

2

Runnable에 대한 이해는 기본적으로 정확합니다.

Thread.start()에 대한 잘못된 가정을하고있는 것이 문제입니다. 실제로, Thread.start()는 새로운 네이티브 스레드와 그 스택이 생성되게하고 스레드 이 실행되도록합니다. 그러나 구현 종속start 호출이 원래 스레드로 반환되기 전에 새 스레드가 예약되고 실행되는지 여부가 결정됩니다.

코드의 다른 문제는 run() 메서드가 본질적으로 CPU를 폴링 루프로 돌리는 것입니다. 여러 개의 코어가있는 플랫폼에서 실행하지 않는 한 응용 프로그램의 동작이 매우 "느려지는"경우 ... 배터리가 빠르게 소모됩니다. 실제로 그릴 무언가가있을 때까지 run() 메서드를 사용하여 이벤트를 구동해야합니다.

구현 방법을 알려주는 Android에 대한 정보는 충분하지 않지만 현재 앱에서 수행중인 작업은 나에게 매우 잘못되었습니다.

관련 문제