如何访问Java方法外部的局部变量?
我需要在方法内访问字符串stream1,但它只在方法范围内起作用。我已经在类中将其声明为全局变量。请参见下面的示例代码:如何访问Java方法外部的局部变量?,java,android,Java,Android,我需要在方法内访问字符串stream1,但它只在方法范围内起作用。我已经在类中将其声明为全局变量。请参见下面的示例代码: public class EmbeddedPlayerActivity extends AppCompatActivity { String stream1; LowCostVideo xGetter; @Override protected void onCreate(@Nullable Bundle savedInstanceSt
public class EmbeddedPlayerActivity extends AppCompatActivity {
String stream1;
LowCostVideo xGetter;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_embedded_player);
xGetter = new LowCostVideo(this);
LowCostVideo xGetter = new LowCostVideo(this);
xGetter.onFinish(new LowCostVideo.OnTaskCompleted() {
@Override
public void onTaskCompleted(ArrayList<XModel> vidURL,
boolean multiple_quality) {
stream1 = "show me";
Toast.makeText(getApplicationContext(),
stream1,Toast.LENGTH_LONG)
.show(); // Its works showing text "show me"
}
});
Toast.makeText(getApplicationContext(),
stream1,Toast.LENGTH_LONG)
.show(); // Not works, its give NULL result
}
}
公共类EmbeddedPlayerActivity扩展了AppCompativeActivity{
字符串流1;
低成本视频xGetter;
@凌驾
创建时受保护的void(@Nullable Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_embedded_player);
xGetter=新的低成本视频(本);
LowCostVideo xGetter=新的LowCostVideo(此);
xGetter.onFinish(新的低成本视频.OnTaskCompleted(){
@凌驾
已完成的公用void onTaskCompleted(ArrayList vidURL,
布尔多重(质量){
stream1=“向我展示”;
Toast.makeText(getApplicationContext(),
流1,吐司。长度(长)
.show();//其作品显示文本“show me”
}
});
Toast.makeText(getApplicationContext(),
流1,吐司。长度(长)
.show();//不起作用,其结果为空
}
}
onTaskCompleted()
是一种回调方法。在异步任务完成之前,不会调用该方法中的Toast。但是onCreate()
底部的Toast会立即被调用,而不必等待onTaskCompleted()
完成。简单地定义回调方法并不意味着代码将在那里暂停并等待它完成
因此,如果要设置stream1
的值,必须从onTaskCompleted()
进行设置。如果以后要使用stream1
的值,则必须检查onTaskCompleted()
是否已执行。这可以通过直接从onTaskCompleted()
调用使用stream1
的方法来实现,也可以通过在使用前对stream1
执行空检查来实现
异步操作是编程中最困难的课题之一。有一百万种方法可以处理它。问题不在于如何访问变量。当您访问它时,问题将被排除。具体来说,在第二个toast中,您是在调用
onTaskCompleted
回调之前访问变量的
基本上,您的onCreate
方法将无法使用onTaskCompleted
设置的变量,因为后者直到onCreate
调用返回后才被调用
请注意,new LowCostVideo.OnTaskCompleted(){…}
实际上正在创建一个匿名内部类的实例,该类将传递给LowCostVideo
实例。只有当LowCostVideo
对象完成任务时,才会调用该实例的方法
很明显,你在这里做的只是一个测试。在“真正的”代码中,您必须找出如何执行。。。不管你真正想做什么。。。另一方面。谢谢你的回答。我对java编程非常陌生,这是否意味着不可能在方法之外访问stream1变量?或者此问题的任何其他解决方案。您已经在类级别声明了
stream1
,因此可以在类中的任何位置访问它。但是,在执行onTaskCompleted()
之前,其值将为null。这就像在给汽车加油之前试着启动汽车一样。onTaskCompleted()
回调听起来好像表明某种类型的视频已经加载。因此,也许您可以通过显示加载指示符开始活动,然后在onTaskCompleted()
中隐藏加载指示符并显示视频流。是的,我缩小了代码以使我更容易理解程序的工作原理,因为在实际代码中我会感到困惑。我对java非常熟悉。谢谢你的回答。