我正在使用AsyncTask在加载Rss News时显示progressBar。因为这是我第一次使用asyncTask我不知道我的方法是否正确,所以你能不能告诉我它是否对你好看?它的工作但我只是想吃!谢谢
public class BackgroundAsyncTask_nea extends
AsyncTask<Void, Void, Void> {
private ProgressDialog dialog;
int myProgress;
@Override
protected void onPostExecute(Void result) {
// TODO Auto-generated method stub
displayRss();
dialog.dismiss();
}
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
dialog = ProgressDialog.show(nea.this, "", "Loading. Please wait...", true);
myProgress = 0;
}
@Override
protected void onProgressUpdate(Void... values) {
// TODO Auto-generated method stub
//super.onProgressUpdate(values);
}
@Override
protected Void doInBackground(Void... arg0) {
// TODO Auto-generated method stub
loadFeed();
return null;
}
}
loadFeed();
private void loadFeed(){
try{
BaseFeedParser parser = new BaseFeedParser();
messages = parser.parse();
}
catch (Throwable t){
Log.e("OSFP.News",t.getMessage(),t);
finish();
}
}
displayRss();
private void displayRss(){
ArrayList<HashMap<String, String>> List_nea = new ArrayList<HashMap<String, String>>(messages.size());
for (Message msg : messages){
des.add(msg.getDescription());// keimeno
text.add(msg.getTitle());// titlos
url.add(msg.getLink());// link
imgl.add(msg.getImgLink());
HashMap<String, String> map = new HashMap<String, String>();
map.put("name", msg.getTitle());
map.put("date", msg.getDate());
List_nea.add(map);
ListAdapter mSchedule = new SimpleAdapter(this, List_nea, R.layout.row,
new String[] {"name", "date"}, new int[] {R.id.TextView01, R.id.TextView02});
this.setListAdapter(mSchedule);
}
AnimationSet set = new AnimationSet(true);
Animation animation = new AlphaAnimation(0.0f, 1.0f);
animation.setDuration(400);
set.addAnimation(animation);
animation = new TranslateAnimation(
Animation.RELATIVE_TO_SELF, 0.0f,Animation.RELATIVE_TO_SELF, 0.0f,
Animation.RELATIVE_TO_SELF, -1.0f,Animation.RELATIVE_TO_SELF, 0.0f
);
animation.setDuration(400);
set.addAnimation(animation);
LayoutAnimationController controller = new LayoutAnimationController(set, 0.5f);
ListView listViewn = getListView();
listViewn.setLayoutAnimation(controller);
}
答案 0 :(得分:2)
要更新进度条,您需要拨打publishProgress()功能。你在代码中的任何地方都没有这样做。如果我是你,我会将AsyncTask的引用传递给你的loadFeed函数。像这样:
protected Void doInBackground(Void... arg0) {
// TODO Auto-generated method stub
loadFeed(this);
return null;
}
private void loadFeed(AsyncTask<Void, Void, Void> asyncTask){
// make calls to publishProgress in here.
try{
BaseFeedParser parser = new BaseFeedParser();
messages = parser.parse();
}
catch (Throwable t){
Log.e("OSFP.News",t.getMessage(),t);
finish();
}
}
您还需要实现您没有的onProgressUpdate()
方法。这是您实际更新进度条值的地方。
protected void onProgressUpdate(Integer... progress) {
dialog.setProgress(progress[0]);
}
答案 1 :(得分:0)
是。 这是正确的工作流程,在UI线程上执行之前显示进度对话框(也可以在此类之外完成,但这种方式似乎更好),在doInBackground方法上工作,如果需要,使用publishProgress()更新ProgressDialog ,然后解除你的ProgressDialog并在你的UI线程中显示onPostExecute()的结果。
答案 2 :(得分:0)
在loadFeed解析器中,您可以使用方法publishProgress
的AsyncTask引用将进度更新发送到onProgressUpdate
,您可以在其中更新进度条。