Android 从AsyncTask填充全局数组并调用onCreate
有没有过这样的时刻:你盯着一段代码看了一个小时,仍然想不出答案?是的,现在是我了 我正在为班级做最后一个项目,但我无法让这一段代码正常工作。这是绝对重要的,它的工作,否则它就违背了计划的目的。我甚至向我的教授寻求帮助。。。他不知道如何帮我解决这个问题。一天前我发布了一个类似的问题,但我想以另一种方式重新询问,看看它是否有帮助(很抱歉,如果是重新发布,我没有其他帮助来源:/) 我的问题是,在AsyncTask类中填充MainActivity之后,我需要访问其上的数组元素。数组是全局定义的,但只要我尝试访问它的元素或大小,它就会崩溃。我需要能够在AsyncTask之外调用此数组 我已经搜索了几个小时,并尝试从AsyncTask“返回”数组,但它也崩溃了 这是我的代码(我已经包括了关于它在哪里崩溃的注释):Android 从AsyncTask填充全局数组并调用onCreate,android,arrays,android-asynctask,Android,Arrays,Android Asynctask,有没有过这样的时刻:你盯着一段代码看了一个小时,仍然想不出答案?是的,现在是我了 我正在为班级做最后一个项目,但我无法让这一段代码正常工作。这是绝对重要的,它的工作,否则它就违背了计划的目的。我甚至向我的教授寻求帮助。。。他不知道如何帮我解决这个问题。一天前我发布了一个类似的问题,但我想以另一种方式重新询问,看看它是否有帮助(很抱歉,如果是重新发布,我没有其他帮助来源:/) 我的问题是,在AsyncTask类中填充MainActivity之后,我需要访问其上的数组元素。数组是全局定义的,但只要我
我的班级伙伴和我不确定如何正确调用全局数组(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);