2013-03-07 60 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); 
    }