我是java和android开发的新手,我有一个问题,让我解释一下.我有自定义接口和自定义类,使用它作为监听器.
在我的HomeActivity中,我在自定义类上调用方法,类通过侦听器(接口)响应,这是简短版本:
public class HomeActivity extends Activity implements WebClientResponseListener {
private User user;
@Override
protected void onCreate(Bundle savedInstanceState) {
//....
// I call my class and add this as a listener:
MyWebServiceClient mws = new MyWebServiceClient(getApplicationContext());
mws.getProducts(this.user.getToken(), this)
}
//....
@Override
public void onDataDownloadSuccess(JSONObject jsonObject) {
Log.d("DATA", "SUCCESS");
}
}
Run Code Online (Sandbox Code Playgroud)
当我像这样运行它一切正常.调用onDataDownloadSuccess方法,我可以看到日志输出.
当我尝试从OnClickListener运行它时,会出现此问题:
private void sendRequest() {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(getString(R.string.request_info_title));
builder.setItems(items, this);
//.....
builder.create().show();
}
Run Code Online (Sandbox Code Playgroud)
后来我参加了同样的活动:
public void onClick(DialogInterface dialogInterface, int which) {
MyWebServiceClient mws = new MyWebServiceClient(getApplicationContext());
mws.getProducts(user.getToken(), this)
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我的侦听器onDataDownloadSuccess方法不会被调用.我可以在控制台中看到:
调用unregisterIRListener()
和
GC_FOR_ALLOC释放1613K,35%免费13400K/20408K,暂停18ms,总计18ms
我一直在寻找解决方案,我已经尝试了一些例子:
//in OnClick
mws.getProducts(user.getToken(), HomeActivity.this);
Run Code Online (Sandbox Code Playgroud)
我创建了私有变量HomeActivity,并在onCreate中调用
homeActivity = this;
Run Code Online (Sandbox Code Playgroud)
然后在onClick我试图通过homeActivity而不是这个,但没有运气.提前致谢.
总是尝试使用YOUR_ACTIVITY_NAME.this,因为当您只使用"this"时,它指向当前context.假设你在OnClickListener,它是一个匿名类,所以当你在里面使用它时.它会指向button不是activity.因此,您需要使用activityname.this指向活动.
根据需要context而不是activity,变量需要:
Context homeActivity;
Run Code Online (Sandbox Code Playgroud)
要么
Context context;
Run Code Online (Sandbox Code Playgroud)
然后进去 onCreate()
context=this;
Run Code Online (Sandbox Code Playgroud)
使用它context或homeActivity在你的活动或HomeActivity.this
在单击侦听器内," this"是单击侦听器的引用.