使用AsyncTask将数据插入数据库的正确方法是什么

时间:2015-04-19 18:44:54

标签: android

我使用AsyncTask从服务器下载数据,我想将数据插入到我的数据库中。我在哪里放置插入代码,如果用户按下Home按钮,如何阻止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
    }
}

3 个答案:

答案 0 :(得分:1)

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

如果取消AsyncTask,则不会调用onPostExecute()

来自The Documentation for AsyncTask.cancel()

  

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

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

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

答案 1 :(得分:0)

首先,您开始从doInBackground(String... params)

内的服务器下载数据库

然后在onPostExecute(String result)方法内编写数据库插入逻辑,并在其末尾关闭数据库。

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

希望它有意义......

答案 2 :(得分:0)

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