4

这是我第一次使用 AsyncTask 并且可能有点困惑,关于传递值。

我有 4 ArrayList<String>s,其中包含应插入数据库的数据。我希望这个插入在后台完成。通过从我拥有的 4 个数组列表中获取值,将至少有 50 行插入到数据库中,并且一次插入 1 行。

有人可以指导我如何做到这一点吗?

现在我创建了一个扩展 AsyncTask ::: 的子类 InsertData

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

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

我在 4 个数组列表中有值,我需要从每个数组列表中检索 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 +"')");
    }

如果有人可以给我一个关于如何实现这一点的概述,那就太好了。

4

5 回答 5

8

尝试以下操作,无论如何,您可以为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...);
于 2013-04-09T06:11:34.973 回答
2

您可以直接将列表传递给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);
于 2013-04-09T06:13:09.207 回答
0

你可以这样通过

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

    public InsertData(String stg1, String stg2, String stg3, String stg4) {

    } 

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

像这样调用 asynctask

InsertData task = new InsertData (stg1, stg2, st3, stg4);    
task.execute();
于 2013-04-09T06:08:24.460 回答
0

不要将 ArrayList 用于所有值...只需使用一个 Arraylist。你可以使用 bean 例如

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

现在调用你public void insert_row(int count, String image_url, String name, String number)的 doInBackground 并传递 aryItem。试试这个

于 2013-04-09T06:17:25.343 回答
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;
        }   
}
于 2013-04-09T06:36:27.840 回答