2013-08-27 3 views
-2

웹에서 세부 정보를 다운로드하고 doInBackground(), 내 UI를 업데이트하려는 경우 해당 메서드 내에서 작업에 대한 참조를 얻어야한다고 생각합니다. 어떻게 할 수 있습니까, 아니면 다른 방법으로 할 수 있습니까? ? something 매개 변수는 무엇이되어야합니까? 또는 UI를 실시간으로 업데이트 할 수 없습니까?AsyncTask 내의 UI 업데이트 방법

public class DownloadActivity extends ListActivity { 

public class DownloadItems extends AsyncTask<Something,Integer,Long> { 

    @Override 
    protected Long doInBackground(DownloadActivity... params) { 

     Toast.makeText(params[0], getIntent().getExtras().get("location").toString(), Toast.LENGTH_SHORT).show(); 
     return null; 
    } 

} 

public void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 
    new DownloadItems().execute(Something); 
} 

} 
+1

Plz이 참조 http://stackoverflow.com/questions/9671546/asynctask-android-example –

답변

0

가장 좋은 방법은 UI에 영향을 미치는 요소를 onPostExecute()으로 옮기는 것입니다. UI를 업데이트 할 수 있기 때문입니다.

다른 방법이 있지만 AsyncTask를 사용할 때 실제로 사용하지 않을 이유가 없습니다.

public class DownloadActivity extends ListActivity { 

    public void onCreate(Bundle savedInstanceState){ 
     super.onCreate(savedInstanceState); 
     new DownloadItems(this).execute(); 
    } 

    public class DownloadItems extends AsyncTask<Something,Integer,Long> { 

     private Context context; 

     public DownloadItems(Context c){ 
      context = c; 
     } 

     @Override 
     protected Long doInBackground(DownloadActivity... params) { 
      // Do something 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void result) { 
      super.onPostExecute(result); 
      Toast.makeText(context, context.getIntent().getExtras().get("location").toString(), Toast.LENGTH_SHORT).show(); 
     } 
    } 
} 
+0

잘 작동하지만보기를 활동에 추가 할 수 없습니다. this.addContentView (view, params)는 onCreate 내에서 작동하지만 onPostExecute() 내에서 Context ctx와 함께 작동하지 않습니다. 왜 그런가요? 어떻게 해결할 수 있습니까? ----- 도와주세요. <----- – user2722364

+0

이 문제의 생성자 사용법을 보여 주셔서 감사합니다. 간단한 변경 컨텍스트에서 View를 다운로드 할 수있었습니다. DownloadActivity – user2722364

+0

@ user2722364 유형으로 내 문제가 해결 되었습니까? :) – whitfin

0

당신은 매개 변수로 상황을 전달하거나 추가하는 생성자를 만들 수 있습니다. 당신이 컨텍스트 관련된 모든 작업을 할 수있는 활동의 컨텍스트를 전달하여

public class DownloadItems extends AsyncTask<Something,Integer,Long> { 

    Context context; 

    public DownloadItems(Context cntx){ 
     context = cntx; 
    } 
    @Override 
    protected Long doInBackground(DownloadActivity... params) { 

     //Toast.makeText(params[0], getIntent().getExtras().get("location").toString(), Toast.LENGTH_SHORT).show(); 
     Toast.makeText(context, "String test", Toast.LENGTH_SHORT).show(); 
     return null; 
    } 

} 

public void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 
    new DownloadItems(this).execute(Something); 
} 

.

+0

이 예외를 던질까요? –

+0

여기서? 나는이 방법을 시도했다. –

+0

잘 작동하지만 활동에보기를 추가 할 수 없습니다. this.addContentView (view, params)는 onCreate 내에서 작동하지만 onPostExecute() 내에서 Context ctx와 함께 작동하지 않습니다. 왜 그런가요? 어떻게 해결할 수 있습니까? ----- 도와주세요. <----- – user2722364

2

Handler을 사용하거나 onPostExecute()에서 UI를 업데이트하는 것이 좋습니다. 비동기가 백그라운드 로직을 처리하고 작업이 끝나면 UI를 업데이트하십시오.

+1

onPostExecute doInBackground 완료 후, 여러 항목에 대한 각각의 의견에 대한 피드백 onProgressUpdate 각 항목에 대해 피드백을받습니다. –

+0

친절하게도 몇 가지 예제 코드를 게시 할 수 있습니까?그것은 내가 무엇을 찾고있는 것 같아요 ----> – user2722364

0

doInBackground()에서 UI 작업을 실행할 수 없으므로 onPostExecute()에서 수행해야합니다. DownloadActivity에서는 DownloadItems의 인스턴스를 생성하고 당신이 당신의 물건을 다운로드 할 URL을 전달합니다 : 예 : AsyncTask를에서

public class DownloadActivity extends ListActivity { 

    private void someMethod() { 
     DownloadItems yourTask = new DownloadItems(getApplicationContext()); 
     yourTask.execute(yourUrl); 
    } 

, 당신이 doInBackground()에 다운로드 작업을 할 것이며을 반환 이 onPostExecute()에 의해 처리 될 수 있도록 결과 :

public class DownloadItems extends AsyncTask<Something,Integer,Long> { 

    Context mContext; 

    public DownloadItems(Context context){ 
     mContext = context; 
    } 

    @Override 
    protected String doInBackground(String... params) { 

     String theResult; 
     // download operations using url stored in params[0], and where you set theResult variable (for example...) 
     return theResult; 
    } 

onPostExecute()에서, 위의 코드에서, 예를 들어, 결과 처리, 당신이 호출 할 수있는 토스트 :

 @Override 
     protected void onPostExecute(String result) { 
      Toast.makeText("YOUR TAG", result, Toast.LENGTH_SHORT).show(); 
     } 
+0

잘 작동하지만보기를 활동에 추가 할 수 없습니다. this.addContentView (view, params)는 onCreate 내에서 작동하지만 onPostExecute() 내에서 Context ctx와 함께 작동하지 않습니다. 왜 그런가요? 어떻게 해결할 수 있습니까? ----- 도와주세요. <----- – user2722364

+0

이 문제의 생성자 사용법을 보여 주셔서 감사합니다. 간단히 컨텍스트를 DownloadActivity 유형으로 변경하여 추가 할 수있었습니다. – user2722364

+0

컨텍스트를 작업에 캐스팅 할 수 있습니다. private Activity = (Activity) mContext'를 사용하여 mActivity에서 addView()를 호출 할 수 있습니다. 그럼 내 대답을 받아 들일 수 :) – jbihan

0

당신은 doInBackground에서 이것을 호출 할 수 있습니다 ...

runOnUiThread(new Runnable() { 
    public void run() { 
     //Your code 
    } 
}); 

을하지만 지금 ... 자세한 내용은 AsyncTask을 읽어 보시기 바랍니다 있지 않거나 UI를 업데이트 할 onPostExecute를 사용

+0

왜 네거티브입니까? 틀렸어? 그것의 작품이고 나는 유효한 대답을주고, 올바른 접근을위한 문서를 보여주고 있습니다 .... –

관련 문제