2015-04-19 75 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 –

相關問題