2010-12-27 6 views
60

http 서버에서 rss 피드를로드하는 동안 사용자 정의 progressdialog를 표시하려고했지만 하드 검색을 수행했지만 아무 것도 도움이되지 않았습니다. 유일한 해결책은 AsyncTask를 사용해야한다는 것입니다. 하지만이 AsyncTask 전달할 매개 변수에 대해 혼란 스러워요. 여기 내 활동이다 :progressDialog AsyncTask

import java.util.ArrayList; 
import java.util.List; 

import com.cyberesa.info.BaseFeedParser; 
import com.cyberesa.info.Message; 
import com.cyberesa.info.MessageListAdapter; 
import com.cyberesa.info.R; 

import android.app.ListActivity; 
import android.os.Bundle; 
import android.util.Log; 
import android.widget.TextView; 

public class Soirees extends ListActivity { 
    private List<Message> messages; 
    private TextView tvSorties; 
    private MyProgressDialog dialog; 
    @Override 
    public void onCreate(Bundle icicle) { 

     super.onCreate(icicle); 

     setContentView(R.layout.sorties); 

     tvSorties=(TextView)findViewById(R.id.TVTitle); 
     tvSorties.setText("Programme des soirées"); 

     loadFeed(); 

    } 

    private void loadFeed(){ 
     try{ 
      BaseFeedParser parser = new BaseFeedParser(); 
      messages = parser.parse(); 
      List<Message> titles = new ArrayList<Message>(messages.size()); 
      for (Message msg : messages){ 
       titles.add(msg); 
      } 
      MessageListAdapter adapter = new MessageListAdapter(this,titles); 
      this.setListAdapter(adapter); 
      adapter.notifyDataSetChanged(); 

     } catch (Throwable t){ 
      Log.e("ImageLoader",t.getMessage(),t); 
     } 
    } 

} 

당신이 날이에 AsyncTask를 추가 도와 주시겠습니까?

public class Soirees extends ListActivity { 
    private List<Message> messages; 
    private TextView tvSorties; 

    //private MyProgressDialog dialog; 
    @Override 
    public void onCreate(Bundle icicle) { 

     super.onCreate(icicle); 

     setContentView(R.layout.sorties); 

     tvSorties=(TextView)findViewById(R.id.TVTitle); 
     tvSorties.setText("Programme des soirées"); 

     new ProgressTask(Soirees.this).execute(); 


    } 


    private class ProgressTask extends AsyncTask<String, Void, Boolean> { 
     private ProgressDialog dialog; 
     List<Message> titles; 
     private ListActivity activity; 
     //private List<Message> messages; 
     public ProgressTask(ListActivity activity) { 
      this.activity = activity; 
      context = activity; 
      dialog = new ProgressDialog(context); 
     } 



     /** progress dialog to show user that the backup is processing. */ 

     /** application context. */ 
     private Context context; 

     protected void onPreExecute() { 
      this.dialog.setMessage("Progress start"); 
      this.dialog.show(); 
     } 

      @Override 
     protected void onPostExecute(final Boolean success) { 
       List<Message> titles = new ArrayList<Message>(messages.size()); 
       for (Message msg : messages){ 
        titles.add(msg); 
       } 
       MessageListAdapter adapter = new MessageListAdapter(activity, titles); 
       activity.setListAdapter(adapter); 
       adapter.notifyDataSetChanged(); 

       if (dialog.isShowing()) { 
       dialog.dismiss(); 
      } 

      if (success) { 
       Toast.makeText(context, "OK", Toast.LENGTH_LONG).show(); 
      } else { 
       Toast.makeText(context, "Error", Toast.LENGTH_LONG).show(); 
      } 
     } 

     protected Boolean doInBackground(final String... args) { 
      try{  
       BaseFeedParser parser = new BaseFeedParser(); 
       messages = parser.parse(); 


       return true; 
      } catch (Exception e){ 
       Log.e("tag", "error", e); 
       return false; 
      } 
      } 


    } 

} 

@Vladimir, 들으 코드가 매우 도움이되었다 :

는 고정 코드는 그래서 onPostExecute에보기 수정을 이동하여 고정 Houssem

답변

41

을 주셔서 감사합니다.

+3

ok, upvote 또는 해결 방법으로 표시 =) –

+0

내부 처리기를 만들 수 없습니다. Looper.prepare()를 호출하지 않은 스레드이 오류가 발생합니다. 이 문제를 해결하는 방법. – Noby

+0

이것에 한 가지 더 추가 할 필요가 있다고 생각합니다. AsyncTask에 대한 전역 전용 개체를 만들어야하며 작업이 소멸되면 AsyncTask를 취소해야합니다. 귀하의 경우, AsyncTask가 완료되기 전에 사용자가 뒤로 버튼을 누르면 응용 프로그램이 거의 충돌합니다. – tasomaniac

123
/** 
* this class performs all the work, shows dialog before the work and dismiss it after 
*/ 
public class ProgressTask extends AsyncTask<String, Void, Boolean> { 

    public ProgressTask(ListActivity activity) { 
     this.activity = activity; 
     dialog = new ProgressDialog(activity); 
    } 

    /** progress dialog to show user that the backup is processing. */ 
    private ProgressDialog dialog; 
    /** application context. */ 
    private ListActivity activity; 

    protected void onPreExecute() { 
     this.dialog.setMessage("Progress start"); 
     this.dialog.show(); 
    } 

     @Override 
    protected void onPostExecute(final Boolean success) { 
     if (dialog.isShowing()) { 
      dialog.dismiss(); 
     } 


     MessageListAdapter adapter = new MessageListAdapter(activity, titles); 
     setListAdapter(adapter); 
     adapter.notifyDataSetChanged(); 


     if (success) { 
      Toast.makeText(context, "OK", Toast.LENGTH_LONG).show(); 
     } else { 
      Toast.makeText(context, "Error", Toast.LENGTH_LONG).show(); 
     } 
    } 

    protected Boolean doInBackground(final String... args) { 
     try{  
      BaseFeedParser parser = new BaseFeedParser(); 
      messages = parser.parse(); 
      List<Message> titles = new ArrayList<Message>(messages.size()); 
      for (Message msg : messages){ 
       titles.add(msg); 
      } 
      activity.setMessages(titles); 
      return true; 
     } catch (Exception e) 
      Log.e("tag", "error", e); 
      return false; 
     } 
    } 
} 

public class Soirees extends ListActivity { 
    private List<Message> messages; 
    private TextView tvSorties; 
    private MyProgressDialog dialog; 
    @Override 
    public void onCreate(Bundle icicle) { 

     super.onCreate(icicle); 

     setContentView(R.layout.sorties); 

     tvSorties=(TextView)findViewById(R.id.TVTitle); 
     tvSorties.setText("Programme des soirées"); 

     // just call here the task 
     AsyncTask task = new ProgressTask(this).execute(); 
    } 

    public void setMessages(List<Message> msgs) { 
     messages = msgs; 
    } 

} 
+0

고맙습니다. 그래서 이걸 시도하고 있습니다. 내가 물었 듯이, 어떤 매개 변수가 여기에 전달됩니까? MessageListAdapter 어댑터 = new MessageListAdapter (this, titles)가 오류 – Houssem

+0

을 throw하기 때문에 Boolean 부울 doInBackground (final String ... args)가 충분합니다. 당신은 그냥 목록 어댑터를 설정해야합니다. –

+0

죄송합니다 블라드, 전 완전히 혼란 스러워요 : S (초심자 경우) – Houssem

3

며칠 전이 문제에 대한 아주 멋진 해결책을 발견했습니다. 그것에 대해 읽어보십시오 here. 두 단어로 Mike는 ProgressDialog와 AsyncTask를 중재하는 AsyncTaskManager를 만들었습니다. 이 솔루션을 사용하는 것은 매우 쉽습니다. 프로젝트에 여러 인터페이스와 여러 클래스를 포함시키고 활동에 간단한 코드를 작성하고 BaseTask에서 새로운 AsyncTask를 중첩하면됩니다. 또한 유용한 팁이 있기 때문에 의견을 읽으라고 조언합니다.

8

AsyncTask가 매우 유용합니다!

class QueryBibleDetail extends AsyncTask<Integer, Integer, String>{ 
     private Activity activity; 
     private ProgressDialog dialog; 
     private Context context; 

     public QueryBibleDetail(Activity activity){ 
      this.activity = activity; 
      this.context = activity; 
      this.dialog = new ProgressDialog(activity); 
      this.dialog.setTitle("查询经文"); 
      this.dialog.setMessage("正在查询:"+tome+chapterID+":"+sectionFromID+"-"+sectionToID); 
      if(!this.dialog.isShowing()){ 
       this.dialog.show(); 
      } 
     } 

     @Override 
     protected String doInBackground(Integer... params) { 
      Log.d(TAG,"经文doInBackground"); 
      publishProgress(params[0]); 

      if(sectionFromID > sectionToID){ 
       return ""; 
      } 

      String queryBible = "action=query_bible&article="+chapterID+"&id="+tomeID+"&verse_start="+sectionFromID+"&verse_stop="+sectionToID+""; 
      try{ 
       String bible = (Json.getRequest(HOST+queryBible)).trim(); 
       bible = android.text.Html.fromHtml(bible).toString(); 
       return bible; 
      }catch(Exception e){ 
       e.printStackTrace(); 
      } 
      return null; 
     } 

     @Override 
     protected void onPostExecute(String bible){ 
      Log.d(TAG,"经文onPostExecute"); 
      TextView bibleBox = (TextView) findViewById(R.id.bibleBox); 
      bibleBox.setText(bible); 
      this.dialog.dismiss(); 
     } 
    } 
0

이 질문이 제기 된 이후 (그리고 누군가가 응답을 게시 한 이후로) 몇 년이 지났습니다. 그 이후 ProgressDialog는 API 수준 O에서 Android's official documentation.에 따라 사용이 중단되었습니다. 따라서 문서 작성자가 제안하는대로 ProgressDialog 대신 an inline progress bar을 사용하는 것이 좋습니다.

-1

이 질문에 대한 답변이 이미 있으며 대부분의 대답은 정확하지만 구성 변경과 관련된 주요한 문제는 해결되지 않습니다. 더 나은 방법으로 비동기 작업을 작성하려면이 문서 https://androidresearch.wordpress.com/2013/05/10/dealing-with-asynctask-and-screen-orientation/을보십시오.

+0

@ 누가 언제나 이것을 투표했습니다. 이 답변에 무엇이 잘못되었는지 말씀해주십시오. 그것이 내가 읽고 중간 개발자와 공유하고 싶은 좋은 기사 중 하나입니다. – Prakash