android,使用 getApplicationContext() 自定义 class
android, custom class with getApplicationContext()
我正在开发一个使用大量网络请求进行数据检索的应用程序。
网络请求当前为 URLConnection
,带有 HttpsURLConnection
。
我遇到的问题是我多次调用 getApplicationContext()
。当我在 activity class 中声明 class 之前,这已经很好了,但是我希望只在单独的 class 中声明 AsyncTask 以导入到activity class 在需要的地方。我假设我不能从自定义 class getApplicationContext()
,因为它没有扩展 activity。我将如何解决这个问题?我可以在实例化时将上下文作为参数传递吗?
像这样的东西行得通吗:
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>
?
Can i pass the context as a parameter when i instantiate it?
是的。您可以将当前 Context
作为参数传递给您的自定义 class.
第一种方式:
在您的自定义类中创建单个参数构造函数
Context myCon;
public myClass(Context mCon){
this.myCon=mCon;
}
并且您可以在 Activity
中访问
myClass mc=new myClass(Activity.this);
第二种方式:
通过直接传递给自定义 class 方法
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);
在您的一项活动中(主要 activity 更好)声明此
public static Context context;
在你的 oncreate 添加这个
context=getApplicationContext();
而在其他 类 中只需使用
MainActivity.context
这对我有用
如其他答案所述,您应该将上下文作为参数传递给您的 AsyncTask。
尽管如此,这样做还是会遇到很多问题,例如,如果在 AsyncTask 正在执行并使用此引用时关闭 activity,这将导致异常。
为防止出现这种情况,请避免像其他帖子中提到的那样对您的 activity 进行强引用,并使用弱引用。确保始终检查弱引用的 return 值是否为 null。
示例:
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
}
}
};
}
}
我正在开发一个使用大量网络请求进行数据检索的应用程序。
网络请求当前为 URLConnection
,带有 HttpsURLConnection
。
我遇到的问题是我多次调用 getApplicationContext()
。当我在 activity class 中声明 class 之前,这已经很好了,但是我希望只在单独的 class 中声明 AsyncTask 以导入到activity class 在需要的地方。我假设我不能从自定义 class getApplicationContext()
,因为它没有扩展 activity。我将如何解决这个问题?我可以在实例化时将上下文作为参数传递吗?
像这样的东西行得通吗:
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>
?
Can i pass the context as a parameter when i instantiate it?
是的。您可以将当前 Context
作为参数传递给您的自定义 class.
第一种方式:
在您的自定义类中创建单个参数构造函数
Context myCon;
public myClass(Context mCon){
this.myCon=mCon;
}
并且您可以在 Activity
中访问
myClass mc=new myClass(Activity.this);
第二种方式:
通过直接传递给自定义 class 方法
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);
在您的一项活动中(主要 activity 更好)声明此
public static Context context;
在你的 oncreate 添加这个
context=getApplicationContext();
而在其他 类 中只需使用
MainActivity.context
这对我有用
如其他答案所述,您应该将上下文作为参数传递给您的 AsyncTask。 尽管如此,这样做还是会遇到很多问题,例如,如果在 AsyncTask 正在执行并使用此引用时关闭 activity,这将导致异常。
为防止出现这种情况,请避免像其他帖子中提到的那样对您的 activity 进行强引用,并使用弱引用。确保始终检查弱引用的 return 值是否为 null。
示例:
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
}
}
};
}
}