2013-04-09 120 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; 
     } 
}