开发一个使用大量网络请求进行数据检索的应用。
网络请求目前为URLConnection
,HttpsURLConnection
。
问题我得到的是我多次拨打getApplicationContext()
。这在我在活动类中声明类之前已经很好了,但是我希望在一个单独的类中声明AsyncTask,以便在需要时导入到活动类。我假设我不能从自定义类getApplicationContext()
,因为它没有扩展活动。我该如何解决这个问题?我可以在实例化时将上下文作为参数传递吗?
<小时/> 会像这样的工作:
Context contxt = getApplicationContext();
CustomClass custmClass = new CustomClass();
ArrayList<Object> parameters = new ArrayList<Object>();
parameters.add(contxt);
...
custmClass.execute(parameters);
CustomClass extends AsyncTask<ArrayList<Object>, Void, Boolean>
?
答案 0 :(得分:4)
正如其他答案所述,您应该将上下文作为参数传递给AsyncTask。 尽管如此,如果你在AsyncTask执行时关闭你的活动并使用这个引用,你可能会遇到很多问题,这将导致异常。
为防止出现这种情况,请避免对其他帖子中提到的活动进行强烈引用,并使用弱引用。确保始终检查弱引用的返回值是否为空。
示例:
import com.example.MyActivity;
public class MyTask {
private final WeakReference<MyActivity> myActivity;
public MyTask(MyActivity myActivity) {
this.myActivity = new WeakReference<MyActivity>(myActivity);
}
private AsyncTask<String, Integer, Integer> createAsyncTask() {
return new AsyncTask<String, Integer, Integer>() {
@Override
protected void onPreExecute() {
super.onPreExecute();
// prepare execution
}
@Override
protected Integer doInBackground(String... params) {
// code
return 0;
}
@Override
protected void onPostExecute(Integer result) {
if (myActivity.get() != null && !myActivity.get().isFinishing()) {
// do something
}
}
};
}
}
答案 1 :(得分:1)
在你的一个活动中(主要活动更好)声明这个
public static Context context;
你的oncreate中的添加了这个
context=getApplicationContext();
在其他课程中只需使用
MainActivity.context
这对我有用
答案 2 :(得分:0)
我可以在实例化时将上下文作为参数传递吗?
是。您可以将当前Context
作为参数传递给自定义类。
在自定义类中创建单个参数构造函数
Context myCon;
public myClass(Context mCon){
this.myCon=mCon;
}
您可以在Activity
中访问
myClass mc=new myClass(Activity.this);
直接传递给Custom类方法
public void getCount(Context mCon){
//Directly used mCon here
}
Context contxt = getApplicationContext();
CustomClass custmClass = new CustomClass(contxt);
ArrayList<Object> parameters = new ArrayList<Object>();
parameters.add(contxt);
...
custmClass.execute(parameters);