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