我有一些私有的AsyncTask方法,我想要突破公共外部类。在我的应用程序中,我有一个扩展Application的公共类,它包含了我想从我的应用程序的不同部分访问的一些共享例程。然而,当我打破AsyncTask类时,我不再能够调用getApplicationContext()来获取对我的应用程序库的引用(该类不会立即从Activity继承任何内容)。 getBaseContext()也会有问题。我是否应该在实例化并从那里构建时将上下文传递给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);
}
}
答案 0 :(得分:10)
我是否应该在实例化并从那里构建时将一个上下文传递给AsyncTask?
您没有选择权,因为您将无法通过任何其他方式获得Context
。
答案 1 :(得分:1)
你应该这样做。就我而言,它有效:
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);
}
答案 2 :(得分:0)
在AsyncTask的构造函数中传递Context,或者在Application类中使用静态变量来访问它(set sMyInstace = this;
)。第一种解决方案更可取。