获取Android中回调的“外部”变量的值

时间:2018-10-08 18:37:59

标签: android interface callback

接口方法中有一个字符串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;
            }
        });
    }

}

这是我遇到过很多次但始终无法解决的问题。现在,如果您有帮助,我想处理。

我正在onCreate内执行getMediaInfo()方法。当我在执行getMediaInfo()后将结果记录到onCreate内时,结果将为。但是,如果我在onClick按钮或其他按钮中运行它,则会得到我想要的结果。

有什么办法可以在我想要的任何地方返回回调消息?

3 个答案:

答案 0 :(得分:1)

类似您的函数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);
    }
});

答案 1 :(得分:0)

如果您的进一步操作取决于onSuccess回调中设置的值,则只需从此回调方法中调用一个函数。您需要提供有关此变量到底要做什么的更多信息。

答案 2 :(得分:0)

异步调用可能会很棘手,但是您必须等到变量完成后才能完成。这意味着在异步调用的回调中调用依赖于该变量的任何方法。真的没有办法解决。您可能需要拨打两个版本的电话;一个用于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
}

}