2014-12-02 2 views
-2

나는 run 함수로 runnable을 구현하는 클래스가 있습니다.Java/Android 스레드 일시 중지 오류

@Override 
public void run() 
{ 
    while(running) 
    { 
    // thread code goes here:: 
    threadCode();//// 
    // thread code ends here 
    try 
    { 
     Thread.sleep(10); 
    } 
    catch (InterruptedException e) 
    { 
     e.printStackTrace(); 
    } 
    } 
} 

이제 뭔가 문제가 발생하면 스레드를 일시 중지하려고합니다. wait() 및 notify()를 사용하려고했지만 응용 프로그램이 손상된 다음 나중에 "실행 중"부울을 사용하고 일시 중지와 같이 false로 설정 한 다음 true로 돌아와서 다시 시작하는 아이디어가 나타났습니다. 불행히도 여전히 응용 프로그램이 충돌합니다.

logcat에서 치명적인 오류가 발생합니다.

스레드를 일시 중지 어떤 작업을 간단한 방법이 있나요 "() Looper.prepare라고하지 스레드 내부 핸들러를 만들 수 없습니다"?/ Thx

편집 : 스레드에 관한 것이 아닙니다. 충돌이 발생한 곳을 찾았습니다. 그것은 여기 경고 대화 상자에서 충돌 그것의 코드입니다 :

AlertDialog.Builder builder1 = new AlertDialog.Builder(c); 
     builder1.setTitle("Game over!"); 
    builder1.setMessage("You survived "+secs+"."+msecs+ " seconds."); 
    builder1.setCancelable(false); 
    builder1.setPositiveButton("Replay", 
      new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int id) 
     { 
      // intialStuff(); 
      dialog.cancel(); 
     } 
    }); 
    builder1.setNegativeButton("Rage quit", 
      new DialogInterface.OnClickListener() { 
     public void onClick(DialogInterface dialog, int id) { 
      dialog.cancel(); 
     } 
    }); 

    AlertDialog alert11 = builder1.create(); 
    alert11.show(); 

내가 어쩌면 캔버스 클래스에서 작동하지 못할 캔버스 클래스 에 그것을 실행하려고? C는 주 활동의 컨텍스트입니다.

+0

은 무엇 당신의 로그 캣 당신을 말해 주는가? – 323go

답변

0

안드로이드 쓰레드에서는 일반 자바 'main'기반 프로그램과 다르게 작동합니다. UI 스레드에서 스레딩 된 스레드는 자신의 용도로 Looper를 사용해야하며 그렇지 않은 경우 기본 UI 스레드의 Looper로 폴백합니다. run 메소드 내부에서 Looper.prepare()를 호출하는 쿼리의 경우, 아마도 내부의 첫 번째 라인이이를 수행 할 것입니다. 그러나 장기간의 확장 성과 정확한 접근 관점에서 보면 로더 또는 AsynchTask 사용을 고려하십시오.

+0

예제를 보여 주실 수 있습니까? – hey

+0

google for "android asynctask tutorial" – Nazgul

+0

문제가 스레드에 없으며 alertDialog와 관련이 있습니다. 주 질문을 편집했습니다. ; – hey

0

두 가지 문제점이있었습니다. 우선 충돌을 일으킨 AlertDialog 메시지에 int 값을 설정했습니다. 수정은 다음과 같습니다

setMessage("You survived "+Integer.toString(secs)+"."+Integer.toString(msecs)+" seconds.") 

두 번째 문제와 메인, 내가에 AlertDialog가 충돌하지 않도록 스레드에서 투수를 사용했다.

두 번째 수정 : 핸들러. 실행 기능에서

private Handler threadHandler = new Handler() 
{ 
     public void handleMessage(android.os.Message msg) 
     { 
      //Go to thread function 
      threadCode(); 
     } 
}; 

전화를 :

@Override 
public void run() 
{ 
    while(true) 
    { 
    try 
    { 
     Thread.sleep(10); 
     //handler 
     if(running) 
     threadHandler.sendEmptyMessage(0); 
    } 
    catch (InterruptedException e) 
    { 
     e.printStackTrace(); 
    } 
    } 
} 
관련 문제