【问题标题】:how to overwrite a global variable in inner class如何覆盖内部类中的全局变量
【发布时间】:2018-07-17 19:35:16
【问题描述】:

我想在 on create 方法之外的内部类中重写一个全局变量。

    public class MainMenuActivity extends FragmentActivity {

    String user_type;

     @Override
        protected void onCreate(Bundle savedInstanceState) { 

    user_type="collion";
        result();
    //print user_type

    }

    private void result(){
        ValueEventListener valueEventListener = new ValueEventListener() {


            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                if(!getData(dataSnapshot)){
                    user_type="vendor";
                    inti(user_type);
                    result();
                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {}
        };
        uidRef.addListenerForSingleValueEvent(valueEventListener);

    }
}

但它仍然给 user_type 冲突而不是供应商。请帮我解决这个问题

【问题讨论】:

标签: android scope global-variables global


【解决方案1】:

根据您在 result() 方法中的代码,您添加了 ValueEventListener,我想这来自 Firebase。这是异步调用所以你不可能除了public void onDataChange(DataSnapshot dataSnapshot)方法会在你调用result()方法时被调用。

这将异步发生,因此当您在调用 result() 方法后尝试打印 user_type 字段时,旧值将被打印,因为新值尚未更新。

总之,

@Override
public void onDataChange(DataSnapshot dataSnapshot) {
    if(!getData(dataSnapshot)){
        user_type="vendor";
        inti(user_type);
        result();
    }
}

由于此方法不会被同步调用,因此不会立即更新该字段,因此打印语句将打印该字段中的原始数据

【讨论】:

    【解决方案2】:

    只需使用MainMenuActivity.user_type = "vendor" inside the inner class,这样代码就知道您正在引用 MainMenuActivity 类成员。

    【讨论】:

    • 不会有任何区别。因为只有一个字段名称user_type 而没有其他。不会发生冲突。这是因为回调延迟
    • 哦,是的,我实际上误解了这个问题。您的答案正确!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-27
    • 2019-02-27
    • 2013-03-18
    • 2015-03-13
    • 1970-01-01
    • 2011-11-20
    • 1970-01-01
    相关资源
    最近更新 更多