Android 异步任务类中的getApplicationContext?

Android 异步任务类中的getApplicationContext?,android,android-asynctask,Android,Android Asynctask,我有两个私有AsyncTask方法,我想将它们分解为公共外部类。在我的应用程序中,我有一个公共类扩展应用程序,其中包含一些我希望从应用程序的不同部分访问的共享例程。但是,当我分解AsyncTask类时,我不再能够调用getApplicationContext()来获取对我的应用程序库的引用(该类现在不会从Activity继承任何内容)。getBaseContext()也会有问题。当AsyncTask被实例化并从中构建时,我是否应该将上下文传递到AsyncTask中?不确定那是否安全 import

我有两个私有AsyncTask方法,我想将它们分解为公共外部类。在我的应用程序中,我有一个公共类扩展应用程序,其中包含一些我希望从应用程序的不同部分访问的共享例程。但是,当我分解AsyncTask类时,我不再能够调用getApplicationContext()来获取对我的应用程序库的引用(该类现在不会从Activity继承任何内容)。getBaseContext()也会有问题。当AsyncTask被实例化并从中构建时,我是否应该将上下文传递到AsyncTask中?不确定那是否安全

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);
      }

}
import java.util.ArrayList;
导入android.os.AsyncTask;
公共类DlTask扩展了异步任务
{
长totalbytes=0;
长totalread=0;
阵列列表数据;
@凌驾
受保护的void onPreExecute()
{   
AppLib lib=(AppLib)getApplicationContext();
lib.saveStatusText(“联系”+lib.getServerAddress()+”:“+lib.getServerPort()+”);
super.onPreExecute();
}
@凌驾
受保护对象doInBackground(对象…参数)
{
data=lib.sendCommand(CMD_列表);
返回true;
}
@凌驾
受保护的void onPostExecute(对象结果)
{
如果(数据!=null)
{
lib.saveStatusText(data.size()+“找到文件”);
}
其他的
{
Log.d(标记“数据为空”);
Toast.makeText(getBaseContext(),msg,Toast.LENGTH_SHORT).show();
}
super.onPostExecute(结果);
}
}
当AsyncTask被实例化并从中构建时,我是否应该将上下文传递到AsyncTask中


您没有选择,因为您将无法通过任何其他方式获取上下文。

在AsyncTask的构造函数中传递上下文,或者在应用程序类中使用静态变量访问它(set
sMyInstace=this;
)。不过,第一种解决方案更可取。

您应该这样做。就我而言,它是有效的:

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);
  }

您应该在构造函数中传递上下文。您应该将AsyncTask构造函数与上下文构造函数一起使用。不建议在构造函数中传递上下文,因为它会泄漏上下文对象。[你能详细说明一下@commonware吗?为什么
getApplicationContext()
AsyncTask
的UI部分不起作用?(例如:
onPreExecute()
onPostExecute()
)这个链接“建议”它可以工作,但我的现实表明它不会编译(Sdk 8--17);@donfede:“为什么getApplicationContext()无法从AsyncTask的UI部分工作?--因为
getApplicationContext()
上下文
上的一种方法,并且
异步任务
不会从
上下文
继承。如果在异步任务完成之前销毁活动,这不会导致泄漏吗?@MikeIsrael:在任务持续时间内,是的。
异步任务
是为短期操作而设计的。任何需要一秒钟以上时间的操作或者应该通过其他方式来处理,例如
IntentService
@commonware谢谢,因为简洁但准确的答案总是值得赞赏的。