Android AsyncTask和进度条

时间:2013-08-26 08:52:41

标签: android android-asynctask

我的Android应用中遇到问题, 我搜索得太多但我找不到解决问题的线索。 这是我的问题

我有一个列表视图,在每个列表项上单击,我启动一个新的AsyncTask,它更新列表项中的进度条。

当系统出于任何原因破坏我的活动时,问题就出现了,AsyncTasks仍在工作,但它不会影响新创建的进度条,

任何人都可以帮助我吗? 提前谢谢。

3 个答案:

答案 0 :(得分:1)

我遇到了同样的问题然后我所做的是我有一个Serializable类,其中存储了listview的数据,在该类中我创建了一个名为

的变量

int progress;

当从asynsTask更新任何内容时,我将对此变量的更新设置为每行唯一,因为可序列化的类和对象。这是示例 - :

Content.java

 public class Content implements Serializable {

            @SerializedName("id")
            protected String id;

            protected int progress = -1;

            public String getId() {
                   return id;
            }

            public String setId(String id) {
                   this.id = id;
            }

            public int getProgress() {
                   return progress;
            }

            public void setProgress(int progress) {
                   this.progress = progress;
            }
    }

MainActivity.java - :

AsyncAdapter - :

    public class AsyncAdapter extends ArrayAdapter<Content>   {

    Context context;
    ArrayList<Content> items;
    private static final int TYPE_MAX_COUNT = 1;

    public AsyncAdapter(Context context, int resource,
            int textViewResourceId, ArrayList<Content> items) {
        super(context, resource, textViewResourceId, items);
        this.context = context;
        this.items = items;
    }

    public int getViewTypeCount() {
        return TYPE_MAX_COUNT;
    }

    @Override
    public View getView(final int position, View convertView,
            ViewGroup parent) {

                 // Layout inflate code

                 // if else condition to visible progress bar
                 viewHolder.progressbar.setProgress(content.getProgress(position));

                 viewHolder.downloadButton
                        .setOnClickListener(new OnClickListener() {

                            @Override
                            public void onClick(View arg0) {
                 //Start service here
                 Intent serviceIntent = new Intent(MainActivity.this,DownloadService.class);
                 serviceIntent.putExtra("id",id);
                 startService(serviceIntent);

            }});
    }
 }

在BroadCastReceiver中,您可以设置进度并更新进度条的进度。

public class DownloadReceiver extends BroadcastReceiver {


@Override
public void onReceive(Context context, final Intent intent) {

    final int progress = intent.getIntExtra("progress", 0);
    final String broadcastId = intent.getStringExtra("id"); 

  for(int i=0;i<contents.size();i++) {
        if(contents.getId().equals(broadcastId)) {
             contents.get(i).setProgress(progress);
        }
   }

   adapter.notifyDataSetChanged(); // to update progressbar and listview
  removeStickyBroadcast(intent);
 }

从服务中你可以将进度发送到接收器并可以同时更新它。我认为这是更好的选择而不是使用asynTask.To在Content中添加数据你要么解析它并使用gson添加或明确地添加它我希望这会对你有所帮助,你会更好地了解如何处理listview中的进度条。

答案 1 :(得分:0)

创建一个回调侦听器方法并在activity中覆盖它。从AsynkTask中的onProgressUpdate调用此回调方法并更新进度条。

答案 2 :(得分:0)

我认为这Post可以帮到你。但这尤其适用于因配置更改而重新创建活动的情况。