2013-09-03 4 views
3

나는 그것을 이해할 수 없다.왜 내 스레드가 UI 스레드를 고정 시키나요?

무엇 때문에,이 스레드 코드는 실제로 UI 스레드에서 실행됩니다. 중단 점이 있으면 UI가 중지됩니다. 또는 잠자기, UI가 중지되었습니다. 따라서 네트워크 활동은 "ui"스레드에서 허용되지 않습니다.

Ive는 비동기 작업을 사용하지 않았습니다. 루핑하는 적절한 방법을 알지 못하기 때문입니다. (onPostExecute에서 그것의 새로운 인스턴스를 호출하면 나쁜 관행처럼 보이고, 것처럼 비동기은 일회성 작업입니다.

내가 스레드를 확장 할 수 있습니다.

public class SyncManager extends Thread { 

public SyncManager(Context context){ 
    sdb = new SyncManagerDBHelper(context); 
    mContext = context;  
} 

@Override 
public void run() {  

    while(State == RUNNING) { 
     try{ 
      SyncRecords(); // Break point here = UI freeze. 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     try { 
      Thread.sleep(10000); // So also causes UI freeze. 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

public void startThread() { 
    Log.i("SyncManager", "start called"); 

    if((State == PAUSED || State == STOPPED) && !this.isAlive()) 
    { 
     State = RUNNING; 
     run();  
    } 
} 

을 내 활동에서 나는

sm = new SyncManager(this); 
    sm.startThread(); 
전화
+0

봐 : https://stackoverflow.com/questions/8052522/why-we-call-thread-start-method-which-in-turns-calls-run-method/36812010#36812010 –

답변

21

당신은 어떤 새로운 스레드를 시작하는 Thread.start()를 사용해야합니다. 를 지금까지 내가 직접 실제로 새 스레드를 시작하도록 시스템을 발생하지 않습니다 run()를 호출 아는 한, 따라서 차단 UI.

는 다음에 startThread() 방법을 변경

하고 그 다음 작동합니다 :

public class SyncManager extends Thread { 

    public void startThread() { 

     if((State == PAUSED || State == STOPPED) && !this.isAlive()) { 
      State = RUNNING; 
      start(); // use start() instead of run() 
     } 
    } 
} 

Read here을보다 구체적인 내용은 자바 블로그를 재 방문에서. 에서

+1

는 한숨, 나는 알고 있었다 어리석은 질문이었다. 아이러니하게도 나는 테스트 쓰레드를 썼고'start();를 넣었다. 나는 물어 보지 않으면 더 많은 시간을 낭비했다. 지금은 이해가됩니다. 메서드 호출을 직접 호출하는 것처럼 UI 스레드에서 메서드를 호출하기 만하면 run()이 호출됩니다. 감사! – Doomsknight

+2

당신은 내 생각에 꽤 환영합니다. 그리고 그 질문은 어리석은 것이 아닙니다. 많은 사람들이이 작은 실수를 피하는 데 도움이 될 것입니다 ;-) 나는 한 때 실수를 저지른 것이기 때문에 나는 이것에 대한 답을 즉시 알고있었습니다. –

+1

2 년 후반 및 예, 그것은 나를 도왔습니다 = D – user2582318

관련 문제