2013-03-07 33 views
6

我有幾個私人的AsyncTask方法,我想分成公共外部類。在我的應用程序中,我有一個擴展應用程序的公共類,它包含一些我想從我的應用程序的不同部分訪問的共享例程。但是,當我分解AsyncTask類時,我不再能夠調用getApplicationContext()來獲取對我的應用程序庫的引用(該類不會從Activity繼承任何東西)。 getBaseContext()也會有問題。當它被實例化並從那裏構建時,我應該傳遞一個上下文到AsyncTask中嗎?不知道這是否安全。AsyncTask類中的getApplicationContext?

import java.util.ArrayList; 
import android.os.AsyncTask; 

public class DlTask extends AsyncTask 
{ 
    long totalbytes = 0; 
    long totalread = 0; 
    ArrayList <String> data; 

    @Override 
    protected void onPreExecute() 
    { 
     AppLib lib = (AppLib) getApplicationContext(); 

     lib.saveStatusText ("Contacting " + lib.getServerAddress() + ":" + lib.getServerPort() + "..."); 
     super.onPreExecute(); 
    } 

     @Override 
     protected Object doInBackground (Object... params) 
     { 
     data = lib.sendCommand (CMD_LIST); 
     return true; 
     } 

     @Override 
     protected void onPostExecute (Object result) 
     { 

     if (data != null) 
     { 
        lib.saveStatusText (data.size() + " files found"); 
     } 
     else 
     { 
      Log.d (TAG, "data is null"); 
      Toast.makeText (getBaseContext(), msg, Toast.LENGTH_SHORT).show();      
     } 

     super.onPostExecute(result); 
     } 

} 
+1

您應該在構造函數中傳遞上下文。 – 2013-03-07 18:25:15

+0

您應該使用AsyncTask構造函數與上下文。 – Ashok 2013-03-07 18:26:47

回答

9

我應該是通過上下文到的AsyncTask當它被實例化,並建立從那裏?

您沒有選擇,因爲您將無法通過任何其他方式獲得Context

+0

你能說說@CommonsWare嗎?爲什麼getApplicationContext()不能從AsyncTask的UI部分工作? (例如:'onPreExecute()'或'onPostExecute()')這個鏈接'建議'它可以工作,但我的現實表明它不會編譯(Sdk 8 - 17); http://www.daniweb.com/software-development/mobile-development/threads/449375/how-to-get-context-in-asynctask – donfede 2013-04-21 17:10:12

+1

@donfede:「爲什麼getApplicationContext()不能從UI部分工作AsyncTask?「 - 因爲'getApplicationContext()'是'Context'的一個方法,'AsyncTask'不能從'Context'繼承。 – CommonsWare 2013-04-21 17:22:21

+2

如果在asynctask完成之前活動被銷燬,這不會造成泄漏嗎? – MikeIsrael 2013-12-19 12:29:43

0

要麼在您的AsyncTask的構造函數中傳遞Context,要麼在Application類中使用靜態變量來訪問它(設置爲sMyInstace = this;)。第一種解決方案雖然更好。

0

你應該這樣做。在我的情況下,它的工作原理:

public class DlTask extends AsyncTask { 
    private Context context; 

    public DlTask(Context context) { this.context = context; } 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     .......... 
    } 

    @Override 
    protected Object doInBackground (Object... params) 
    { 
     data = lib.sendCommand (CMD_LIST); 

     return true; 
    } 

    @Override 
    protected void onPostExecute (Object result) 
    { 

     if (data != null) 
    { 
     lib.saveStatusText (data.size() + " files found"); 
    } 
    else 
    { 
     Log.d (TAG, "data is null"); 
     Toast.makeText (context, msg, Toast.LENGTH_SHORT).show();    
     //You can use the CONTEXT like this (passing the context variable like parameter 
    } 

    super.onPostExecute(result); 
    } 
相關問題