【问题标题】:Android - inserting into database after finishing AsyncTaskAndroid - 完成 AsyncTask 后插入数据库
【发布时间】:2013-11-20 07:59:48
【问题描述】:

我在 Java(和 android)方面非常陌生,因此尽管进行了广泛的搜索,但我无法以我有限的知识解决它。

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

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

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

附: 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
    }
    }
}

【问题讨论】:

    标签: android database class android-asynctask


    【解决方案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,这不是构造函数支持的。

    【讨论】:

    • 问题是 mylibmandbhandler 给出错误“构造函数 mylibmandbhandler(ImportExport.RemoteConnectivity) 未定义”,如果我放入 onPostExecute 方法
    • new mylibmandbhandler(ImportExport.this); 是我认为的关键。
    • 哦,抱歉,错过了……让我试试
    【解决方案2】:

    您需要使用 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));
            }
        }
    }
    

    【讨论】:

    • 好吧,当然我一开始就这样做了.. 但问题是 mylibmandbhandler 给出错误“构造函数 mylibmandbhandler(ImportExport.RemoteConnectivity) 未定义”
    • @AbdullahFahim 查看已编辑的答案。那是因为“this”指的是该位置的 AsyncTask 对象。您需要将其指定为“ImportExport.this”。
    猜你喜欢
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-20
    相关资源
    最近更新 更多