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



接口方法中有一个字符串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()方法。当我在执行后将结果记录在onCreate 中时getMediaInfo()结果将为。但是,如果我在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
}
}

最新更新