2013-08-26 34 views
0

我有一個問題在我的Android應用程序, 我搜索了太多,但我無法找到一個線索來解決它。 這是我的問題的Android的AsyncTask和進度條

我有一個列表視圖,onclick每個列表項我開始一個新的AsyncTask更新列表項中的進度條。

的問題是當系統破壞我的活動以任何理由,在AsyncTasks仍然工作,但它不會影響新創建的進度條,

任何一個能幫助我嗎? 在此先感謝。

+0

你想在活動結束時銷燬AsyncTasks? – AAnkit

+0

沒有,我需要它繼續工作和活動重新更新新progressbars –

+0

它不能做以後,更好的使用服務,如果你想讓它保持工作即使活動是不是在前面。 – AAnkit

回答

1

我是從同一個問題的痛苦,然後我做了什麼是我在其中爲ListView數據存儲和I類創建了一個名爲

INT進度變量Serializable類;

什麼時候會從asynsTask更新我設置更新這個變量是,因爲序列化類的每一行獨特object.Here是例子 - :

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); 
} 

並從服務,您可以發送到接收器的進展,並可以更新simultaneously.I覺得這是更好的選擇,而不是使用asynTask.To在添加內容數據,你將不得不對其進行解析,並添加使用GSON或者明確地添加它。我希望這可以幫助你,並且你會更好地理解如何處理listview中的進度條。

+0

你能分享這個解決方案的任何例子嗎? –

+0

@OmarHassan我編輯了我的答案.. –

+0

感謝您的回覆,我用另一種方式工作 –

0

創建一個回調監聽器方法並在您的活動中覆蓋它。從AsynkTask中的onProgressUpdate調用此回調方法,並更新進度欄。

+0

進度條由列表適配器數據模型所支持。 –

+0

但每個進度條可以從適配器 – kirankk

+0

是進行訪問,這是真實的 –

0

我認爲這Post可以幫助你。但是,對於由於配置更改而重新創建活動的情況尤其如此。