2013-04-09 107 views
3

這是我第一次使用AsyncTask,也可能有點困惑,關於傳遞值。如何將值傳遞給AsyncTask Android

我有4 ArrayList<String> s,其中包含應插入到數據庫中的數據。我想要在後臺完成插入操作。通過從我擁有的4個數組列表中獲取傳值,一次至少插入50行。

有人可以指導我如何做到這一點?

現在我創建一個擴展的AsyncTask子類InsertData :::

private class InsertData extends AsyncTask<Params, Progress, Result>{ 

     @Override 
     protected Result doInBackground(Params... params) { 
      // TODO Auto-generated method stub 
      return null; 
     } 
} 

我有4周的ArrayList,在我需要檢索每個ArrayList中1項,通過4個值到數據庫中值。我如何將這4個值傳遞給AsyncTask,以及如何重複此操作,直到列表中有條目。

這裏是插入1行插入數據庫:::

public void insert_row(int count, String image_url, String name, String number) { 
     // TODO Auto-generated method stub 

     db.execSQL("INSERT INTO contacts VALUES('"+ count +"', '"+ image_url +"', '"+ name +"', '"+ number +"')"); 
    } 

如果有人可以給我如何,我可以實現這樣的概述,這將是巨大的數據庫的方法。

+0

可以傳遞價值的的AsyncTask的構造函數或doInBackground()。 example @ http://developer.android.com/reference/android/os/AsyncTask.html。 doInbackgroudn接收網址 – Raghunandan 2013-04-09 06:06:11

+0

你可以使用構造函數fot這看起來更多看這個http://stackoverflow.com/questions/12280336/progressbar-while-loading-listview-using-asynctask/12280526#12280526 – Dilip 2013-04-09 06:07:05

回答

7

嘗試以下,而且,不管怎麼說,你可以爲InsertData創建構造您所需要的參數,將它們存儲在InsertData並在doInBackground()中使用。

private class InsertData extends AsyncTask<ArrayList, Progress, Result>{ 

      @Override 
      protected Result doInBackground(ArrayList... params) { 
       // TODO Auto-generated method stub 
       ArrayList list1 = params[0]; 
       ArrayList list2 = params[1]; 
       ... 
       return null; 
      } 
    } 

電話:

InsertData task = new InsertData(); 
task.execute(yourList1, yourList2, yourList3...); 
+0

我會盡力回覆您。 – 2013-04-09 06:19:24

+0

這個答案足以解決這個問題嗎? http://stackoverflow.com/questions/34689357/can-i-pass-a-variable-into-a-private-asyncronous-method – santafebound 2016-01-09 03:33:42

0

你可以通過這樣的

通話的AsyncTask這樣

InsertData task = new InsertData (stg1, stg2, st3, stg4);  
task.execute(); 
+0

正如我所說,我必須重複插入約50次,我該怎麼做? – 2013-04-09 06:10:19

+0

檢查arraylist中有多少個值可用,取決於重複循環的大小。 – 2013-04-09 06:12:43

1

您可以直接列出傳遞給doInBackground()這樣做你的所有50次迭代那裏。

private class InsertData extends AsyncTask<List<String>, Progress, Result>{ 

    @Override 
    protected Result doInBackground(List<String>... params) { 
     // TODO Auto-generated method stub 
     List<String> list1 = params[0]; 
     List<String> list2 = params[1]; 
     List<String> list3 = params[2]; 
     List<String> list4 = params[3]; 

     // Do the 50 iterations here.   

     return null; 
    } 
} 

而且你可以通過列表來此AsyncTask這樣的: -

new InsertData().execute(list1, list2, list3, list4); 
0

不使用ArrayList的所有值...只需使用一個ArrayList中。你可以使用bean e.g

ArrayList<ItemBean> aryitem=new ArrayList<ItemBean>(); 

ItemBean是一個bean類..所以你可以設置值有..並從那裏取回。

for (int i = 0; i <aryitem; i++) 
{ 
    itemBean= new ItemBean(); 

    itemBean.set(yourValues); 
    itemBean.set(yourValues); 

aryItem.add(itemBean); 
}  

現在在doInBackground中調用您的public void insert_row(int count, String image_url, String name, String number)並傳遞aryItem。試試這個

+0

如果你必須檢索50次,那麼你應該使用Bean類,正如我所說的..這對你來說很簡單 – 2013-04-09 06:18:36

0

我認爲這可能會幫助你..你可以傳遞這樣的價值..

調用InsertData(AsynkTask)

ArrayList list1,list2,list3,list4; 

InsertData insertd = new InsertData(list1,list2,list3,list4) 
insertd.execute(); 

在InsertData.java

class InsertData extends AsyncTask<Object, Object, Object> 
{ 
    Context ctx; 
    ArrayList li1,li2,li3,li4; 
    public InsertData(Context ct,ArrayList l1,ArrayList l2,ArrayList l3,ArrayList l4) 
    { 
     ctx = ct; 

     this.li1 = l1; 
     this.li2 = l2; 
     this.li3 = l3; 
     this.li4 = l4; 

     dialog = new ProgressDialog(ct); 
     dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
     dialog.setMessage("Loading.. Please Wait.."); 
     dialog.setCancelable(true); 
    } 

     @Override 
     protected Result doInBackground(Params... params) 
     { 
      // Do your Work... 

      return null; 
     } 
}