在我的适配器中,我无法理解特定变量如何能够引用正确的变量。
我正在尝试使我的适配器能够与沙发床lite的实时查询一起使用。我的适配器如下所示:
LiveQuery query;
Context context;
public MyAdapter(Context context, LiveQuery query) {
this.query= query;
this.context = context;
query.addChangeListener(new LiveQuery.ChangeListener() {
@Override
public void changed(LiveQuery.ChangeEvent event) {
((Activity) MyAdapter.this.context).runOnUiThread(new Runnable() {
@Override
public void run() {
enumerator = event.getRows();
notifyDataSetChanged();
}
});
}
});
query.start();
}
有一种方法可以在需要时停止liveQuery:
public void invalidate() {
if (query != null) {
query.stop();
}
}
我正在他们的网站上跟踪this example,但是我很难理解这一点:
据我了解,这部分的查询:
// Let's call this query #1, this is the live query in this instance
this.query
与本部分中的查询不同:
// And call this query #2, this is the live query that was
// passed-in from the method argument
query.addChangeListener(...
query.start();
那么,您如何能够做到这一点:
public void invalidate() {
if (query != null) { // This is query #1, right?
query.stop();
}
}
我以为您添加了更改侦听器并在构造函数中启动的liveQuery是查询2,但是invalidate()中的查询是查询1。这怎么工作?
当我们在一开始就这样做时:
this.query = query;
尚未添加任何更改侦听器,并且尚未启动实时查询,因此我认为它不起作用。我在哪里弄错了?
最佳答案
构造函数将参数引用分配给实例变量,从而使参数和对象的实例变量成为别名。对一个人所做的任何事情都可以通过另一个人访问;它们不是不同的对象,只是对同一对象的不同引用。如果您想进一步探索它,我建议您将参数名称更改为pQuery(或类似名称),并解决将导致的编译错误。那么您就不会混淆哪个“查询”是哪个。请记住,引用变量是一个两步概念,其中包含变量本身和它所引用的对象。这些与原语不同(但有些容易混淆)。
关于java - 该方法和构造函数似乎作用于两个不同的传入/存储变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40686766/