接口方法中有一个字符串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按钮或其他按钮中运行它,则会得到我想要的结果。
有什么办法可以在我想要的任何地方返回回调消息?
答案 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
}
}