获取变量的值“;外部”;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()添加接口回调的附加值
。关于方法是异步的,您是对的,但这将使我从旧回调中解脱出来,并将我绑定到具有相同情况的新回调。我试图指出的一点是,如果您处理异步代码,您将需要保持异步。