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
ok, upvote 또는 해결 방법으로 표시 =) –
내부 처리기를 만들 수 없습니다. Looper.prepare()를 호출하지 않은 스레드이 오류가 발생합니다. 이 문제를 해결하는 방법. – Noby
이것에 한 가지 더 추가 할 필요가 있다고 생각합니다. AsyncTask에 대한 전역 전용 개체를 만들어야하며 작업이 소멸되면 AsyncTask를 취소해야합니다. 귀하의 경우, AsyncTask가 완료되기 전에 사용자가 뒤로 버튼을 누르면 응용 프로그램이 거의 충돌합니다. – tasomaniac