Android自定义监听器回调到不同的地方

问题描述 投票:0回答:1

我有一个通用的自定义监听/回调问题。在我的代码中,我有以下接口和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()

Problem

这些工作大部分时间都很好,但是,有时候queryA很慢而且queryBqueryA之前完成,queryB回调queryB没有问题,但是当queryA完成后,它回调给queryB听众。我想因为B的听众覆盖了A?我该如何避免这种问题?

android interface callback
1个回答
0
投票

当你调用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
}


}
© www.soinside.com 2019 - 2024. All rights reserved.