从OnClickListener访问Activity(this)

Gre*_*reg 6 java android

我是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而不是这个,但没有运气.提前致谢.

Waq*_*med 8

总是尝试使用YOUR_ACTIVITY_NAME.this,因为当您只使用"this"时,它指向当前context.假设你在OnClickListener,它是一个匿名类,所以当你在里面使用时.它会指向button不是activity.因此,您需要使用activityname.this指向活动.


Par*_*rth 6

根据需要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)

使用它contexthomeActivity在你的活动或HomeActivity.this

在单击侦听器内," this"是单击侦听器的引用.