2011-05-30 39 views
0

我有一個backgorund線程,它擴展了AsyncTask,並且我在活動中使用它來從數據庫讀取一些數據。開始一個後臺線程的問題

我使用這個後臺線程爲了不讓我的應用程序被阻塞,因爲需要檢索的大量數據。

通常我啓動線程是這樣的:

public void onResume(){ 

init_task.execute(db); 

} 



public class InitTask extends AsyncTask<DBAdapter, GeoPoint, Void> { 

...some code here.... 


} 



    protected void onPause() { 
     init_task.cancel(true); 
     super.onPause(); 
    } 

的一點是,我開始線程的onResume()和的onPause()

取消它,但現在我有一個不同的問題。

我有一個自動完成,顯示下拉列表,當我點擊這些條目之一時,我想開始後臺線程(我現在從數據庫檢索的數據取決於我點擊的項目)。

那麼,我已經實現了一個監聽器,我在那裏啓動線程....問題是監聽器是onCreate(),所以我不能在onCReate()內使用onResume()....

現在我的問題是,我不知道如何停止線程原因,一旦我離開活動,它仍然從我的數據庫中檢索數據...我希望它停止。

這裏是我的代碼圖:

問題
public void onCreate(Bundle savedInstanceState){ 

    textView.setOnItemClickListener(new OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, 
        long arg3) { 


       init_task = new InitTask(); 
       init_task.execute(db); 

      } 

     }); 


} 

public class InitTask extends AsyncTask<DBAdapter, GeoPoint, Void> { 


} 

:我應該在哪裏等等,只要我離開它停止從數據庫中檢索數據的活動停止我的線程......之後我回來了,重新開始!!?

回答

2

您可以將任務分配給實例字段,並在調用取消之前檢查它是否爲空。

在您的活動類(不onCreate()方法)

InitTask initTask=null; 
中的onPause

()

if (initTask!=null) { 
    initTask.cancel(true); 
    initTask=null; 
} 

休息是相同的。

+0

你是什麼意思實例領域的原因我沒有得到它....我很新的這個!你可以把一個小例子與你的意思,所以我可以理解? – embry 2011-05-30 16:33:49

+0

好的,我添加了一些代碼。 – 2011-05-30 16:43:27

+0

但是我在onCreate()中開始我的線程....你可以在onCreate()中啓動它,只需要這一行:InitTask initTask = null; 應該在我的活動???我說得對嗎? – embry 2011-05-30 16:46:42

0

爲什麼你仍然無法訪問你的init_task?在您的方案中,取消您在偵聽器中創建的AsyncTask實例沒有任何可見的限制。

要處理重新啓動,您可以保存一些標誌並在活動恢復後繼續提取。

+0

雅,...沒有限制,但我應該在哪裏取消它?因爲我試圖取消onDestroy(),但它仍然不會取消,我仍然從數據庫中檢索???? ????是:在哪裏取消它? – embry 2011-05-30 16:32:49

+0

在onPause,和以前一樣 – Olegas 2011-05-30 17:57:12