如何向AsyncTask Android传递值

4
这是我第一次使用AsyncTask,可能对传递值有点困惑。 我有4个包含应该插入数据库的数据的ArrayList<String> s。我希望这种插入在后台完成。最少需要插入50行到数据库中,并且每次插入1行,通过从我的4个arraylist中传递值来进行操作。 有人可以指导我如何做吗?现在我创建了一个扩展AsyncTask的子类InsertData :::
private class InsertData extends AsyncTask<Params, Progress, Result>{

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

我有四个ArrayList中的值,我需要从每个ArrayList中检索一个条目,并将这四个值传递给数据库。如何将这四个值传递给AsyncTask,以及如何重复此操作直到ArrayList中有条目为止。
以下是将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 +"')");
    }

如果有人能够为我提供一个关于如何实现这个的概述,那就太好了。


你可以将值传递给AsyncTask的构造函数或doInBackground()方法。例如请参考http://developer.android.com/reference/android/os/AsyncTask.html。doInBackground()方法接收URL。 - Raghunandan
你可以使用构造函数完成此操作,更多信息请参见https://dev59.com/lmjWa4cB1Zd3GeqPnBba#12280526。 - Dilip
5个回答

8
尝试以下操作,你可以为InsertData创建一个构造函数,并将需要的参数存储在InsertData类字段中,在doInBackground()中使用它们。请保留HTML标记。
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...);

我会尽快回复您关于这个问题的信息。 - Vamsi Challa
这个答案是否足以解决这个问题?http://stackoverflow.com/questions/34689357/can-i-pass-a-variable-into-a-private-asyncronous-method - Martin Erlic

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

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

像这样调用异步任务

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

正如我所说的那样,我需要重复插入大约50次,我该怎么做? - Vamsi Challa
检查ArrayList中有多少个值,根据其大小重复循环。 - RajaReddy PolamReddy

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

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

如果你需要检索50次,那么你应该按照我的建议使用Bean类。这样会更容易。 - Mit Bhatt

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接