2015-04-19 79 views
4

我正在使用AsyncTask从服务器下载数据,并且希望将数据插入到我的数据库中。我必须在哪里放置插入代码,以及如何在用户按下主页按钮时阻止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 
    } 
} 

回答

1

最好的办法是做在onPostExecute()数据库插入操作。

如果AsyncTask被取消,则不会调用。

The Documentation for AsyncTask.cancel()

调用此方法会导致onCancelled(对象)被doInBackground(对象[])返回后在UI线程上调用 。调用这个 方法可以保证不会调用onPostExecute(Object)。在 调用此方法之后,应该尽可能早地检查由doInBackground(Object [])定期检查由 isCancelled()返回的值以尽快完成 任务。

您还可以在您的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 
    } 
+0

为什么我必须在doInBackground中放置isCancelled()方法,如果我在onPostExecute()中执行插入操作? –

+0

好的,谢谢,我会尝试你的建议,如果它的工作,我会标记你的答案,或者我会告诉你,如果我有问题 –

+0

如果AsyncTask iscanceled我如何解雇progressDialog? –

0

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

内。然后onPostExecute(String result)方法写你的数据库插入逻辑,并在它结束时关闭数据库。

如果用户按下Home键最后完成你的活动(它会自动取消您的AsyncTask)

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

+0

如果用户不完成该活动只是把它的背景? –

+0

一旦用户启动异步任务,它将自动执行onPostExecute()方法。所以它会完成任务。我们不用担心这一点。 –

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

中),如果没有完成 –

+0

你需要处理崩溃@覆盖 保护无效的onDestroy这样,如果我按下home键,我想取消的AsyncTask就会死机我的应用程序在DBInsert.insertData((){ 超级 .onDestroy(); asyncTask。取消(真); } –

+1

请注意,虽然此代码可能会回答问题,但只有代码才会回答SO。看到这个:http://meta.stackexchange.com/questions/148272/is-there-any-benefit-to-allowing-code-only-answers-while-blocking-code-only-ques/148274#148274 –

相关问题