Rar*_*arw 9 android callback android-context android-asynctask
标题基本概括了所有内容.如果你有一个从一个类到另一个类的回调,并且需要从回调中调用一些需要上下文的方法,那么正确使用的上下文是什么?一个常见的例子是AsyncTask回调Activity或Fragment使用它的回调.
我通常尽量避免使用,getApplicationContext()但我不能this在回调中用作上下文.这是一个使用更广泛的背景是合适的情况吗?
为了进一步澄清,我正在考虑使用AsyncTask和活动之间的接口进行回调.一旦我进入被覆盖的接口方法,我无法从那里获得活动上下文.
使用Activity的上下文.例:
MyAsyncTask mat = new MyAsyncTask(this);
Run Code Online (Sandbox Code Playgroud)
MyAsyncTask构造函数:
public MyAsyncTask(MyActivity context) {
mContext = context;
}
Run Code Online (Sandbox Code Playgroud)
methodToCall()从内部调用MyActivity的方法MyAsyncTask:
((MyActivity)mContext).methodToCall();
Run Code Online (Sandbox Code Playgroud)
编辑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!!
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
解决方法:
在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
}
});
Run Code Online (Sandbox Code Playgroud)用来MyActivity.this代替this.
另一种方法是声明MyActivity实现了接口:
public class MyActivity extends Activity implements View.OnClickListener {
....
....
@Override
public void onClick(View v) {
Button newButton = Button (this) // Will Work
}
}
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
7704 次 |
| 最近记录: |