получить значение переменной «снаружи» обратного вызова в Android - PullRequest
0 голосов
/ 08 октября 2018

В методе интерфейса есть String message в качестве параметра:

public class Home extends AppCompatActivity {

    private String globalStringResult = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.home_activity);

        getMediaInfo();
        Log.d("Result: ", globalStringResult); // Here result is Null

    }//TODO OnCreate End


    private void getMediaInfo() {
        FFmpeg.getInstance(this).execute(new String[]{"-version"}, 
                new ExecuteBinaryResponseHandler() {
            @Override
            public void onSuccess(String message) {
                globalStringResult  = message;
            }
        });
    }

}

Вот проблема, с которой я сталкивался много раз, но всегда убегал от нее.Теперь я хочу разобраться с этим, если вы мне поможете.

Я выполняю getMediaInfo() метод внутри onCreate.Когда я регистрирую результат внутри onCreate после getMediaInfo() выполнения , результат будет null .Но если я запускаю его внутри кнопки onClick или что-то еще, я получаю желаемый результат.

Можно ли как-нибудь вернуть сообщение обратного вызова в любое место, где я хочу?

Ответы [ 3 ]

0 голосов
/ 08 октября 2018

Если ваши дальнейшие действия зависят от значения, установленного в обратном вызове onSuccess, просто вызовите функцию из этого метода обратного вызова.Вам нужно предоставить больше информации о том, что именно вы пытаетесь сделать с этой переменной.

0 голосов
/ 09 октября 2018

Асинхронные вызовы могут быть сложными, но вы должны подождать, пока они не будут завершены, прежде чем переменная станет доступной.Это означает вызов любых методов, которые полагаются на переменную в обратном вызове асинхронного вызова.Там действительно нет никакого способа обойти это.Вы можете сделать две версии звонка;один для onCreate и один, когда вам нужно позвонить из других мест.

public class Home extends AppCompatActivity {

private String globalStringResult = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.home_activity);

    getMediaInfoOnCreate();
    // move any code below this line into the new method


}//TODO OnCreate End


private void getMediaInfo() {
    FFmpeg.getInstance(this).execute(new String[]{"-version"}, 
            new ExecuteBinaryResponseHandler() {
        @Override
        public void onSuccess(String message) {
            globalStringResult  = message;
            codeThatNeedsToBeRunDuringOnCreateButAfterSettingGlobalStringResult();
        }
    });
}

    private void getMediaInfoOnCreate() {
    FFmpeg.getInstance(this).execute(new String[]{"-version"}, 
            new ExecuteBinaryResponseHandler() {
        @Override
        public void onSuccess(String message) {
            globalStringResult  = message;
        }
    });
}

private void codeThatNeedsToBeRunDuringOnCreateButAfterSettingGlobalStringResult() {
    // put your moved code from onCreate here
    Log.d("Result: ", globalStringResult); // Here correct result will be logged
}

}
0 голосов
/ 08 октября 2018

Похоже, что ваша функция getMediaInfo является асинхронной, что означает, что может пройти некоторое время, прежде чем будет вызван блок onSuccess и установлено ваше значение.Вместо того, чтобы полагаться на переменную, я бы предложил использовать функцию обратного вызова.Таким образом, ваше сообщение будет передано в функцию обратного вызова, и вы сможете использовать его где угодно.

public interface MyCallback{
    void success(String message);
}

Тогда вам нужно будет изменить свою функцию следующим образом.Затем, где бы ни осуществлялся обратный вызов, вы получите сообщение и сможете воздействовать на значение.

public void getMediaInfo(MyCallback callback){
 FFmpeg.getInstance(this).execute(cmdArray, new ExecuteBinaryResponseHandler() {
    @Override
    public void onSuccess(String message) {
        callback.success(message);
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...