【问题标题】:What is the correct way to insert data into database with AsyncTask使用 AsyncTask 将数据插入数据库的正确方法是什么
【发布时间】:2015-04-19 18:44:53
【问题描述】:

我正在使用 AsyncTask 从服务器下载数据,并且我想将数据插入到我的数据库中。如果用户按下主页按钮,我必须将插入代码放在哪里?如何阻止 AsyncTask 插入数据?

我目前正在使用asynctask.cancel(true),但我无法停止数据库插入。

public class TalkToServer extends AsyncTask<String, String, String> {
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        // show progress dialog
    }

    @Override
    protected void onProgressUpdate(String... values) {
        super.onProgressUpdate(values);
    }

    @Override
    protected String doInBackground(String... params) {
        //download data from the server
        return something;
    }

    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
        // dismiss dialog
    }
}

【问题讨论】:

    标签: android


    【解决方案1】:

    最好的选择是在onPostExecute() 中进行数据库插入操作。

    如果AsyncTask 被取消,那么onPostExecute() 将不会被调用。

    来自The Documentation for AsyncTask.cancel()

    调用此方法将导致 onCancelled(Object) 被调用 在 doInBackground(Object[]) 返回后的 UI 线程上。调用这个 方法保证永远不会调用 onPostExecute(Object)。后 调用此方法,您应该检查返回的值 isCancelled() 定期从 doInBackground(Object[]) 完成 尽早完成任务。

    您还可以在 doInBackground() 方法中为 isCancelled() 添加检查。

        @Override
        protected String doInBackground(String... params) {
            //download data from the server
    
            if (isCancelled()){
    
              //Prevent data from being inserted in the database
    
              try {
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            //Dismiss ProgressDialog
                        }
                    });
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
    
    
            }
    
        return something;
        }
    
        @Override
            protected void onPostExecute(String result) {
            super.onPostExecute(result);
            // dismiss dialog
            //Insert data into database
        }
    

    【讨论】:

    • 如果我在 onPostExecute() 中进行插入操作,为什么我必须将 isCancelled() 方法放入 doInBackground?
    • 好的,谢谢你,我会尝试你的建议,如果可行,我会标记你的答案,或者如果我有问题我会告诉你
    • 如果 AsyncTask 被取消,我如何关闭 progressDialog?
    • 所以如果在 doInBackground() 中并从服务器下载数据并且我取消了 AsyncTask 那么它会跳过 if(isCancelled()) 还是会执行它?
    • @PanayiotisIrakleous 即使取消了AsyncTaskdoInBackground() 方法也会运行完成。我刚刚更新了答案,但我还没有测试过这段代码。让我知道它是否有效~
    【解决方案2】:

    首先你开始从doInBackground(String... params)里面的服务器下载数据库

    然后在onPostExecute(String result) 方法中编写您的数据库插入逻辑,并在最后关闭您的数据库。

    如果用户按下主页按钮,最终完成您的活动(它会自动取消您的 AsyncTask)

    希望它有意义...

    【讨论】:

    • 如果用户没有完成活动只是把它放在后台?
    • 一旦用户启动异步任务,它会自动执行 onPostExecute() 方法。所以它会完成任务。让我们不要担心。
    【解决方案3】:
    Create new class which contains data insertion function.
    Ex - 
    
    //create new class
    
    public class DBInsert(){
    
        //write data insertion login in this function.
        public string insertData(){
          ......
          ......
        }
    }
    
    //your async task.
    public class TalkToServer extends AsyncTask<String, String, String> {
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            // show progress dialog 
        }
    
        @Override
        protected void onProgressUpdate(String... values) {
            super.onProgressUpdate(values);
        }
    
        @Override
        protected String doInBackground(String... params) {
            //download data from the server
    
            //Call db insert function.
            DBInsert.insertData();
    
            return something;
        }
    
        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            // dismiss dialog
        }
    }     
    

    【讨论】:

    • 这样,如果我按下主页按钮并且我想取消 AsyncTask,如果它没有完成,它将在 DBInsert.insertData() 中崩溃我的应用程序
    • 你需要处理崩溃 @Override protected void onDestroy() { super.onDestroy(); asyncTask.cancel(true); }
    • 请注意,虽然此代码可能会回答问题,但不鼓励在 SO 上仅使用代码回答。看到这个:meta.stackexchange.com/questions/148272/…
    猜你喜欢
    • 2020-05-15
    • 1970-01-01
    • 1970-01-01
    • 2013-04-05
    • 1970-01-01
    • 1970-01-01
    • 2015-10-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多