【问题标题】:Android custom listner callback to a different placeAndroid自定义监听器回调到不同的地方
【发布时间】:2019-02-20 20:50:33
【问题描述】:

我有一个通用的自定义侦听器/回调问题。 在我的代码中,我有以下接口和LocalDB 读取房间数据库的类:

# Custom interface
public interface MyInterface {
    void OnSuccess();
    void OnFailure();
}

# Class LocalDB
public class LocalDB {
    private MyInterface myInterface;


    public static PIMUserLocalDataSource getInstance(@NonNull Context context) 
    {
        if (INSTANCE == null) {
            synchronized (PIMUserLocalDataSource.class) {
                INSTANCE = new PIMUserLocalDataSource(context);
            }
        }
        return INSTANCE;
    }

    public void setCustomListener(CustomListener customListener) {
        this.customListener = customListener;
    }

    private void queryA() {
        Runnable runnable = new Runnable() {
            result = appDatabase.myDao().getQueryA();
            if (result != null) {
                if (customListener != null) {
                    customListener.onSuccess();
                } else {
                    customListener.onFailure();
                }
            }
        }
    }

    private void queryB() {
        Runnable runnable = new Runnable() {
            result = appDatabase.myDao().getQueryB();
            if (result != null) {
                if (customListener != null) {
                    customListener.onSuccess();
                } else {
                    customListener.onFailure();
                }
            }
        }
    }
}

# Fragment / Activity
LocalDB myDB = LocalDB.getInstance(context)
myDB.setCustomListener(new CustomListener) {
    @Override
    public void OnSuccess() {
        Log.e(logTag, "Success queryA");
    }

    @Override
    public void OnFailure() {
        Log.e(logTag, "Failed queryA");
    }
}
myDB.queryA()

myDB.setCustomListener(new CustomListener) {
    @Override
    public void OnSuccess() {
        Log.e(logTag, "Success queryB");
    }

    @Override
    public void OnFailure() {
        Log.e(logTag, "Failed queryB");
    }
}
myDB.queryB()

问题

这些大部分时间都可以正常工作,但是,有时queryA 很慢并且queryBqueryA 之前完成,queryB 回调到queryB 没问题,但是当queryA 是完成后,它会回调到queryB 监听器。我认为是因为 B 的听众覆盖了 A?我应该如何避免这种问题?

【问题讨论】:

    标签: android interface callback


    【解决方案1】:

    当您调用 queryA 或 queryB 时。传递监听器。

    # Custom interface
    public interface MyInterface {
        void OnSuccess();
        void OnFailure();
    }
    
    # Class LocalDB
    public class LocalDB {
    
    boolean successA,successB;
    
    
        public static PIMUserLocalDataSource getInstance(@NonNull Context context) 
        {
            if (INSTANCE == null) {
                synchronized (PIMUserLocalDataSource.class) {
                    INSTANCE = new PIMUserLocalDataSource(context);
                }
            }
            return INSTANCE;
        }
    
    
        private void queryA(CustomListener customListener) {
            Runnable runnable = new Runnable() {
                result = appDatabase.myDao().getQueryA();
                if (result != null) {
                    if (customListener != null) {
                        customListener.onSuccess();
                    } else {
                        customListener.onFailure();
                    }
                }
            }
        }
    
        private void queryB(CustomListener customListener) {
            Runnable runnable = new Runnable() {
                result = appDatabase.myDao().getQueryB();
                if (result != null) {
                    if (customListener != null) {
                        customListener.onSuccess();
                    } else {
                        customListener.onFailure();
                    }
                }
            }
        }
    }
    
    # Fragment / Activity
    LocalDB myDB_A = LocalDB.getInstance(context)
    myDB.setCustomListener(new CustomListener) {
        @Override
        public void OnSuccess() {
            successA=true;
            checkIfTwoFinishedExcutecode();
            Log.e(logTag, "Success queryA");
        }
    
        @Override
        public void OnFailure() {
            Log.e(logTag, "Failed queryA");
        }
    }
    myDB.queryA(myDB_A )
    
    LocalDB myDB_B = LocalDB.getInstance(context)
        @Override
        public void OnSuccess() {
        successB=true;
        checkIfTwoFinishedExcutecode(); 
        Log.e(logTag, "Success queryB");
        }
    
        @Override
        public void OnFailure() {
            Log.e(logTag, "Failed queryB");
        }
    }
    myDB.queryB(myDB_B)
    
    
    void checkIfTwoFinishedExcutecode(){
    if(successA&&successB){
    // the two is finished. write your code
    }
    
    
    }
    

    【讨论】:

    • 我还没有尝试过这个建议,但是 LocalDB.getInstance(context) 返回相同的对象,所以在执行 queryB 时它也会重置 queryA 监听器,会不会是同样的问题?跨度>
    • 不,不会的。
    • 感谢您的建议。我无法用我的原始代码重现,但我继续实施你们建议的方式,现在它工作正常。如果再次出现同样的问题,我会报告。认为它已解决!再次感谢。
    猜你喜欢
    • 2011-12-24
    • 2015-04-19
    • 2017-02-18
    • 2012-01-19
    • 1970-01-01
    • 2014-11-18
    • 1970-01-01
    相关资源
    最近更新 更多