Обратный звонок в Android в другом месте - PullRequest
0 голосов
/ 17 сентября 2018

У меня есть общий пользовательский вопрос слушателя / обратного вызова.В моем коде у меня есть следующий интерфейс и класс 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 медленно и queryB выполняется до queryA, queryB обратного вызова на queryB не проблема, но когда queryA завершено, это обратный вызов на queryB слушателя.Я думаю, потому что слушатель B перезаписал A?Как мне избежать подобных проблем?

1 Ответ

0 голосов
/ 17 сентября 2018

когда вы вызываете 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
}


}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...