2013-01-18 8 views
2

Android 프로젝트에서 쓰레드를 사용해야합니다. 때때로, 그것은 핵심적으로 효과가 있지만 때로는 그렇지 않습니다. 스레드가 끝나기 전에 시작되지 않고 (SendToServer() 메서드를 호출하지 않음) 시작하지만 다른 함수로 갑자기 복귀합니다 (반환 된 값이 반환 됨).안드로이드 쓰레드가 시작되지 않는 경우가 있음

참고 : 영향을받은 값이 0보다 크면 조건을 제공하고 if 문으로 이동합니다.

다음은 내 코드 샘플입니다. 대신 스레드와 변수를 (업데이트하고 해당), 당신은 AsyncTasks을 사용할 수 있습니다 사용

public static Boolean MyUpdateFunction(MyObject myobject){ 

Boolean updated=false; 
//Code for updating local database 


int affected= SqliteDb.update(....); 

if(affected>0) 
{ 
    //Send updated data to server 
    //For this I must use Thread(I can't use AsyncThread) 
    updated=true; 
    SendToServer(); 

} 


return updated; 
} 

public static void SendToServer() 

{ 
    try{ 
     ; 
     Thread th=new Thread(new Runnable() { 

     public void run() { 
      try { 

       //Create data and send it to server 
       //....... 
      } catch (Exception e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    }); 
    th.start(); 
    th.join(); 




} 
catch(SQLException e) 
{ 
    Toast.makeText(myContext,"ERROR: "+e.getMessage(), Toast.LENGTH_LONG).show(); 
} catch (InterruptedException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 
} 
+2

백그라운드 작업을 위해 Android SDK에서 제공하는 AsyncTask를 사용할 수도 있습니다. – JoxTraex

+0

'th.start(); th.join();'- 왜 쓰레드를 사용 하는가? – Howard

+0

어떤 이유로 AsyncTaks를 사용할 수 없습니다. 프록시 클래스를 생성하는 라이브러리를 사용하며 AsyncTask를 지원하지 않으므로 Thread를 사용해야합니다. – essbek

답변

0

: 참조 : AsyncTask를 가진 http://developer.android.com/reference/android/os/AsyncTask.html

을 정확히하고있는 몇 가지 방법은 당신이 원하는 있습니다

  • onPreExecute
  • doInBackground
  • onPostExecute

따라서 할 수있는 일은 onPreExecute에서 조건을 확인한 다음 doInBackground에서 SendToServer를 수행하고 필요한 작업을 onPostExecute로 수행하는 것입니다.

+0

답장을 보내 주셔서 감사합니다.하지만 AsyncTask를 사용할 수 없으므로 프록시 클래스 generetor 때문에 스레드를 사용해야합니다 (지원하지 않습니다. 비동기) – essbek

+0

어떤 프록시 클래스 생성기를 사용하고 있습니까? 자세한 내용을 알려주십시오. –

+0

WsClient ++ 데모 버전 – essbek

1

다른 사람들은 AsyncTask를 앞으로 방법,하지만 직접 문제가 있다는 점에서 올바른 때문에 당신이 겪고있는 것은 이것이다 (그리고 같은 나는 어떻게 스레딩 작품에 독서 추천 일) :

스레드를 시작하면 새로운 프로세스가 시작됩니다. 일반적으로 대부분의 코드가있는 UI 스레드가 계속됩니다. 따라서 코드 SendToServer()으로 스레드를 실행 한 다음 UI 스레드가 즉시 다음 행으로 이동하므로 정의가 즉시 return updated이됩니다.

당신이 필요로하는 것은 스레드의 콜백이며, 이는 AsyncTask의 onPostExecute() 메서드에서 처리됩니다. 그들이 무엇을 사용하는 방법에 대한 좋은 튜토리얼이있다 here

편집 : 난 그냥 당신이 Asynctasks를 사용할 수 위의 코멘트, 충분히 공정에서 본 적이 있지만 여전히 콜백이 필요합니다/스레드에서 이벤트가 발생하면 이벤트가 반환됩니다.

관련 문제