Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/219.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取变量的值“;外部”;android中回调函数的实现_Android_Interface_Callback - Fatal编程技术网

获取变量的值“;外部”;android中回调函数的实现

获取变量的值“;外部”;android中回调函数的实现,android,interface,callback,Android,Interface,Callback,接口方法中有一个字符串消息作为参数: public class Home extends AppCompatActivity { private String globalStringResult = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView

接口方法中有一个字符串
消息
作为参数:

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()
execution之后将结果记录到onCreate中时,结果将是null。但如果我在一个onClick按钮或其他东西中运行它,我会得到我想要的结果


是否有任何方法可以将回调消息返回到我想要的任何位置?

听起来您的函数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);
    }
});

如果进一步的操作取决于onSuccess回调中设置的值,则只需从该回调方法调用函数即可。您需要提供更多关于如何使用此变量的信息

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

}

如果没有看到onCreate,很难判断,但我猜您是在异步调用返回变量之前尝试使用该变量。如果您有依赖于此变量的代码,您可以将其移动到自己的方法中,并从onSuccess方法调用它。它通过按钮工作,因为,
ClickListener
是一个具有内置回调的接口。在onCreate()之外声明您的变量;类似于私有字符串globalStringResult;作为一个全局变量,还没有设置值。@BakonJarser我编辑了我的问题,我的主要目标是在外部使用它。我不熟悉FFmpeg,但是,我同意您的假设,即
execute()
方法是异步的。但是,在这个示例中,我没有看到向回调方法
onSuccess()添加接口回调的附加值
。关于方法是异步的,您是对的,但这将使我从旧回调中解脱出来,并将我绑定到具有相同情况的新回调。我试图指出的一点是,如果您处理异步代码,您将需要保持异步。