Android - 完成AsyncTask后插入数据库

时间:2013-11-20 07:59:48

标签: android database class android-asynctask

我在Java(& android)中几乎是新手,因此尽管进行了广泛的搜索,但我无法用有限的知识解决它。

在下面的代码中,我想通过AsyncTask从weblink获取JASONArray。之后我想从数组数据中填充我的数据库。

为此,我创建了RemoteConnectivity类,我可以使用JASONArray中的所有数据填充ArrayList importdata。但问题是,我无法从RemoteConnectivity类中访问我的数据库类mylibmandbhandler(我猜因为它没有扩展到Activity)。在ImportExport类中,如果我在调用RemoteConnectivity()。execute()[在下面的代码中]之后编写插入数据库的代码,它会在执行结束前开始插入(很明显,因为它是AsyncTask的属性)。

现在,有人可以指导我完成这个吗?或者任何链接请了解整个过程(我在至少50页中读到了它:()。

P.S。 mylibmandbhandler是我在我的包src文件夹中为我的数据库操作创建的(不是活动)的类。

public class ImportExport extends Activity {
    public void webimport(View v){
        new RemoteConnectivity().execute(); // START OF ASYNCTASK

        //INSERT importdata INTO DATABASE AFTER EXECUTE
        mylibmandbhandler db = new mylibmandbhandler(this);
        for (String[] s : importdata){
        db.addRecord(new mylibman(s));
        }
    }

    final ArrayList<String[]> importdata = new ArrayList<String[]>();

    private class RemoteConnectivity extends AsyncTask<Void, Void, Void> 
    {
    @Override
    protected Void doInBackground(Void... arg0) {
        ..................
        ..................
        importdata.add(dataline); // POPULATE ARRAYLIST IMPORTDATA

        return null;
    }

    @Override
    protected void onPostExecute(Void result1) 
    {
        // WHAT TO WRITE HERE
    }
    }
}

2 个答案:

答案 0 :(得分:1)

您应该在onPostExecute中插入数据,如下所示:

public class ImportExport extends Activity {
    public void webimport(View v){
        new RemoteConnectivity().execute(); // START OF ASYNCTASK        
    }

    final ArrayList<String[]> importdata = new ArrayList<String[]>();

    private class RemoteConnectivity extends AsyncTask<Void, Void, Void>
    {
        @Override
        protected Void doInBackground(Void... arg0) {
            ..................
            ..................
            importdata.add(dataline); // POPULATE ARRAYLIST IMPORTDATA

            return null;
        }

        @Override
        protected void onPostExecute(Void result1)
        {
            //INSERT importdata INTO DATABASE AFTER EXECUTE FINISH (POST EXECUTE)
            mylibmandbhandler db = new mylibmandbhandler(ImportExport.this);
            for (String[] s : importdata){
                db.addRecord(new mylibman(s));
            }
        }
    }
}

原因是,onPostExecute是在doInBackground方法下载数据后执行的方法(回调)。

或者:如果您希望后台线程完成插入,您还可以将insert语句放在doInBackground中。如果插入数据库非常耗时,这可能会有所帮助。在这种情况下,UI线程不会阻止。 “

public class ImportExport extends Activity {
    public void webimport(View v){
        new RemoteConnectivity().execute(); // START OF ASYNCTASK        
    }

    final ArrayList<String[]> importdata = new ArrayList<String[]>();

    private class RemoteConnectivity extends AsyncTask<Void, Void, Void>
    {
        @Override
        protected Void doInBackground(Void... arg0) {
            ..................
            ..................
            importdata.add(dataline); // POPULATE ARRAYLIST IMPORTDATA

            //INSERT importdata INTO DATABASE. NOW DONE IN THE BACKGROUND THREAD (Alternate method)
            mylibmandbhandler db = new mylibmandbhandler(ImportExport.this);
            for (String[] s : importdata){
                db.addRecord(new mylibman(s));
            }

            return null;
        }

        @Override
        protected void onPostExecute(Void result1)
        {

        }
    }
}

更新:在我的回答中要强调的重要一点是,我使用了new mylibmandbhandler(ImportExport.this);代替new mylibmandbhandler(this);this指的是AsyncTask不是构造函数支持的。

答案 1 :(得分:1)

您需要使用onPostExecute方法将数据插入数据表。像这样:

private class RemoteConnectivity extends AsyncTask<Void, Void, Void>
{
    @Override
    protected Void doInBackground(Void... arg0) {
        ..................
        ..................
        importdata.add(dataline); // POPULATE ARRAYLIST IMPORTDATA

        return null;
    }

    @Override
    protected void onPostExecute(Void result1)
    {
        //INSERT importdata INTO DATABASE AFTER EXECUTE FINISH (POST EXECUTE)
        mylibmandbhandler db = new mylibmandbhandler(ImportExport.this);
        for (String[] s : importdata){
            db.addRecord(new mylibman(s));
        }
    }
}