我是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");
}
}
当我运行它时,一切正常。调用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();
}
后来我参加了同样的活动:
public void onClick(DialogInterface dialogInterface, int which) {
MyWebServiceClient mws = new MyWebServiceClient(getApplicationContext());
mws.getProducts(user.getToken(), this)
}
在这种情况下,我的侦听器onDataDownloadSuccess方法未被调用。 我可以在控制台中看到:
调用unregisterIRListener()
和
GC_FOR_ALLOC释放1613K,35%免费13400K / 20408K,暂停18ms,总计 时间18ms
我正在寻找解决方案,我已经尝试了一些例子:
//in OnClick
mws.getProducts(user.getToken(), HomeActivity.this);
我创建了私有变量HomeActivity,在onCreate中我调用了
homeActivity = this;
稍后在onClick上我试图传递homeActivity而不是这个 但没有运气。 提前谢谢。
答案 0 :(得分:6)
始终尝试使用 YOUR_ACTIVITY_NAME.this ,因为当您仅使用“this”时,它会指向当前的context
。假设你在OnClickListener
,它是一个匿名类,所以当你在其中使用 this 时。它会指向button
而不是activity
。因此,您需要使用 activityname.this指向活动。
答案 1 :(得分:5)
当您需要context
而不是activity
时,变量必须是:
Context homeActivity;
或
Context context;
然后在onCreate()
context=this;
在您的活动中使用context
或homeActivity
或HomeActivity.this
在点击监听器中,“this
”是点击监听器的参考。
答案 2 :(得分:0)
您可以创建Context
的实例并将其初始化为侦听器外的this
,然后只需将其调用到您需要的地方
答案 3 :(得分:0)
以上解决方案应该可以很好地工作,但仍要添加一些风味。认为这将有助于某人更好地理解。
public class SampleActivity extends AppCompatActivity {
private Context sampleActivityContext;
private Button continueButton;
// All your class level variables/fields declared in this section
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
sampleActivityContext = this; // Assigning the current activity(i.e.,) SampleActivity context
.......
continueButton = findViewById(R.id.continueButton); // Map the UI element from the XML to the corresponding java element
.......
// Setting the onclick listener for the button
continueButton.setOnClickListener(new View.onClickListener() {
@Override
public void onClick(View view) {
// When you need the context of the activity use sampleActivityContext
// instead of this keyword as this will refer the current view/button within the section
// or you can prefer SampleActivity.this as well
}
}