2013-04-22 2 views
0

비동기 작업을 내부 메서드로 실행해야하는 개체가 있고 메서드에 ui 스레드를 전달한 다음에 ui 스레드를 구현하고 싶습니다. 그런 식으로 asynctask - 이것을하는 방법이 있습니까?비동기 스레드가 ui 스레드에서 실행되도록 보장

의사 :

 public class EditDetails extends Activity{   
       MyObject obj = new obj; 
       obj.syncWithServer(EditDetails.this); 
     } 

     public class MyObject { 
      public void syncWithWerver(EditDetails parent){ 
       final class GetUserHttpTask extends AsyncTask<String/* Param */, Boolean /* Progress */, String /* Result */> { 
         @Override 
         protected String doInBackground(String... params) { 
          return ""; 
         } 
         @Override 
         protected String onPostExecute(String result) { 
           //this doesn't run 
         } 
       } 
      } 
     }   

참고 : onPostExecute는 doInBackground

편집

이 코드 후 해고되지 않기 때문에 순간이 작동하지 않는 경우는 의사 (가)입니다 실제 문제는 여전히 발생하고 있으며 그것을 나열했습니다 http://pastebin.com/jW6JpUbghere .. 기본적으로 그것은 onPostExecute 결코에서 pastebin에서 라인 72를 실행 한 후 붙어옵니다

답변

1

는이처럼 작업을 실행 시도 했습니까? 나는이 일을해야한다고 생각

parent.runOnUiThread(new Runnable() { 

     @Override 
     public void run() { 
      new GetUserHttpTask().execute(); 
     } 
}); 

..

추가 :

귀하의 AsyncTask 구현은 다음과 같이해야한다 : 참고 : 읽기 업데이트 된 의견

class GetUserHttpTask extends AsyncTask<String/* in parameter for doInBackground */, Boolean /* in parameter for onProgressUpdate */, String /* Out parameter and in parameter for onPostExecute method*/> { 
    @Override 
    protected String doInBackground(String... params) { 
     return ""; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     // this doesn't run 
    } 

    @Override 
    protected void onProgressUpdate(Boolean... values) { 
     // TODO Auto-generated method stub 
     super.onProgressUpdate(values); 
    } 
} 
+0

Boris가 언급 한대로 onPostExecute 메소드의 반환 유형을 변경하고 위의 코드 스 니펫을 시도해야합니다. 그것은 작동해야합니다. –

+0

이 스 니펫을 추가했습니다. 실행을 위해 onPostExecute를 얻을 수 없었지만 doInBackground에서 결과가 발생 했으므로 결과 응답에 "ok"코드를 사용하여 수동으로 실행했습니다. – user2083181

2

충분히 이상한 onPostExecutevoid이어야합니다. 재정의 된 메서드의 반환 형식을 변경했을 때 코드가 어떻게 컴파일되고 있는지 궁금합니다.

당신이 해결 한 후 당신의 onPostExecute 다음과 같이 당신이 AsyncTask 실행을 얻을 수 있습니다 :

final class GetUserHttpTask extends AsyncTask<String/* Param */, Boolean /* Progress */, String /* Result */> { 
     @Override 
     protected String doInBackground(String... params) { 
      return ""; 
     } 
     @Override 
     protected String onPostExecute(String result) { 
       // this will run 
     } 
} 
public void syncWithWerver(EditDetails parent){ 
    AsyncTask task = new GetUserHttpTask(); 
    task.execute(); 
} 
+1

@PareshMayani 아니 메서드는 항상 void를 반환합니다. 매개 변수 유형이 변경되었습니다. –

+0

@Perception 이것이 전체적으로 문제를 해결하는 열쇠라고 생각하지 않으면 주석으로 게시했습니다. 기본적으로 그는'onPostExecute'를 올바르게 선언하지 않으므로 해고되지 않습니다. –

+1

@PareshMayani 예 @ 보리스가 맞습니다. 'onPostExecute'의 리턴 타입은'void'이어야합니다. 결과 유형'String'은'onPostExecute' 메쏘드가 아닌'doInBackground' 메쏘드를위한 것입니다 –

관련 문제