标题几乎说明了一切。如果你有一个从一个类到另一个类的回调,并且需要在回调中调用一些需要上下文的方法,那么正确使用的上下文是什么?一个常见示例是AsyncTask
,其中包含使用它的Activity
或Fragment
的回调。
我通常会尽量避免使用getApplicationContext()
,但我不能在回调中使用this
作为上下文。这是一个使用更广泛的背景是合适的情况吗?
为了进一步说明我正在考虑使用AsyncTask和活动之间的接口进行回调。一旦我进入被覆盖的接口方法,我无法从那里获得活动上下文。
答案 0 :(得分:8)
使用活动的上下文。例如:
MyAsyncTask mat = new MyAsyncTask(this);
MyAsyncTask构造函数:
public MyAsyncTask(MyActivity context) {
mContext = context;
}
从methodToCall()
内调用MyActivity的方法MyAsyncTask
:
((MyActivity)mContext).methodToCall();
修改1:
我猜你的问题是这样的:
public class MyActivity extends Activity {
Button b;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.some_layout);
b = (Button) findViewById(...);
b.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Button newButton = new Button(this); // Won't work!!
}
});
}
}
解决方法:
在MyActivity中声明一个方法:getContext()
public Context getContext() {
return (Context)this;
}
b.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Button newButton = new Button(getContext()); // Will work
}
});
使用MyActivity.this
代替this
。
另一种方法是声明MyActivity实现了接口:
public class MyActivity extends Activity implements View.OnClickListener {
....
....
@Override
public void onClick(View v) {
Button newButton = Button (this) // Will Work
}
}
答案 1 :(得分:0)
这是一个像“泄漏”的话题。首先,要通过的活动并不好。根据其他一些建议,人们应该使用getApplication或getApplicationContext。但是你可以使用WeakReference作为你的包装器,即:
static class X {
WeakReference<Activity> context;
X(Activity context) {
this.context = new WeakReference<Activity>(context);
}
}
请记住使用静态来标记您的类,它可以避免对您的主机Activity有潜在的“这个”。
可能会给你一些建议,可能没什么:)