Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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
Android 从AsyncTask填充全局数组并调用onCreate_Android_Arrays_Android Asynctask - Fatal编程技术网

Android 从AsyncTask填充全局数组并调用onCreate

Android 从AsyncTask填充全局数组并调用onCreate,android,arrays,android-asynctask,Android,Arrays,Android Asynctask,有没有过这样的时刻:你盯着一段代码看了一个小时,仍然想不出答案?是的,现在是我了 我正在为班级做最后一个项目,但我无法让这一段代码正常工作。这是绝对重要的,它的工作,否则它就违背了计划的目的。我甚至向我的教授寻求帮助。。。他不知道如何帮我解决这个问题。一天前我发布了一个类似的问题,但我想以另一种方式重新询问,看看它是否有帮助(很抱歉,如果是重新发布,我没有其他帮助来源:/) 我的问题是,在AsyncTask类中填充MainActivity之后,我需要访问其上的数组元素。数组是全局定义的,但只要我

有没有过这样的时刻:你盯着一段代码看了一个小时,仍然想不出答案?是的,现在是我了

我正在为班级做最后一个项目,但我无法让这一段代码正常工作。这是绝对重要的,它的工作,否则它就违背了计划的目的。我甚至向我的教授寻求帮助。。。他不知道如何帮我解决这个问题。一天前我发布了一个类似的问题,但我想以另一种方式重新询问,看看它是否有帮助(很抱歉,如果是重新发布,我没有其他帮助来源:/)

我的问题是,在AsyncTask类中填充MainActivity之后,我需要访问其上的数组元素。数组是全局定义的,但只要我尝试访问它的元素或大小,它就会崩溃。我需要能够在AsyncTask之外调用此数组

我已经搜索了几个小时,并尝试从AsyncTask“返回”数组,但它也崩溃了

这是我的代码(我已经包括了关于它在哪里崩溃的注释):


我的班级伙伴和我不确定如何正确调用全局数组(gr)。我知道onCreate不会等待AsyncTask完成。我们能做些什么来让它发挥作用?谢谢你的帮助和理解。你们可以证明你们比我的教授更有用

问题在于,在postExecute()中初始化globalrates数组之前,您正在访问该数组。有很多方法可以做到这一点,其中之一就是创建一个接口或创建回调,等待在后台线程完成后初始化globalrate

  • 创建一个界面

  • 实现与用户活动的接口

  • 将接口传递给您的asynctask

  • 将后台线程的结果传递给ur接口方法

  • 在活动中,您实现了接口并生成了globalResultBackground方法


将活动传递给AsyncTask,并直接在
onPostExecute

Log.i("BitRateFetcher", "Size from onCreate: " + gr.length);
示例代码:

private class BitRateFetcher extends AsyncTask { PostsActivity activity; ... public BitRateFetcher(PostsActivity activity){ this.activity= activity; } ... @Override protected void onPostExecute(GlobalRates[] test) { activity.gr = ... } } 私有类BitRateFetcher扩展异步任务{ 活动后活动; ... 公共比特率获取程序(PostsActivity活动){ 这个。活动=活动; } ... @凌驾 受保护的void onPostExecute(GlobalRates[]测试){ activity.gr=。。。 } } 在后期活动中

BitRateFetcher br = new BitRateFetcher(this); BitRateFetcher br=新的BitRateFetcher(此); 注意
附加
重新附加
活动以处理设备旋转等情况


编辑:只是注意到你有一个静态,所以你甚至不需要在活动中传递。但同样的原则也适用。

GlobalRates[]gr
是公共的和静态的,因此您不需要真正的新
GlobalRates[]test

只需将
test
的每个实例替换为
gr

 test = gson.fromJson(reader, GlobalRates[].class);

如果需要在Oncreate中访问
gr
,则将该逻辑移动到
postExecute

Log.i("BitRateFetcher", "Size from onCreate: " + gr.length);

您知道有任何教程演示如何使用回调功能吗?谢谢@user3444777。我实现了这一点,并且我能够解决它。
@Override
protected void onPostExecute(GlobalRates[] test) {

    si.globalResultBackground(test);

    Log.i(TAG, "Test Size: " + test.length); // Returns 158
    gr = test;
    Log.i(TAG, "Gr Size: " + gr.length); // Returns 158

    if (dialog.isShowing()) {
        dialog.dismiss();
    }

}
    @Override
public void globalResultBackground(GlobalRates[] gr) {
    //you can freely access the globalrates here because this is called when the
    //background thread is done

           Log.i("BitRateFetcher", "Size from onCreate: " + gr.length);


}
private class BitRateFetcher extends AsyncTask { PostsActivity activity; ... public BitRateFetcher(PostsActivity activity){ this.activity= activity; } ... @Override protected void onPostExecute(GlobalRates[] test) { activity.gr = ... } } BitRateFetcher br = new BitRateFetcher(this);
 test = gson.fromJson(reader, GlobalRates[].class);
gr = gson.fromJson(reader, GlobalRates[].class);
Log.i("BitRateFetcher", "Size from onCreate: " + gr.length);