Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.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
如何访问Java方法外部的局部变量?_Java_Android - Fatal编程技术网

如何访问Java方法外部的局部变量?

如何访问Java方法外部的局部变量?,java,android,Java,Android,我需要在方法内访问字符串stream1,但它只在方法范围内起作用。我已经在类中将其声明为全局变量。请参见下面的示例代码: public class EmbeddedPlayerActivity extends AppCompatActivity { String stream1; LowCostVideo xGetter; @Override protected void onCreate(@Nullable Bundle savedInstanceSt

我需要在方法内访问字符串stream1,但它只在方法范围内起作用。我已经在类中将其声明为全局变量。请参见下面的示例代码:

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非常熟悉。谢谢你的回答。