【问题标题】:Retrieving a Value inside of AsyncTask method in Android在 Android 的 AsyncTask 方法中检索值
【发布时间】:2015-02-12 15:41:16
【问题描述】:

我正在为后台进程实现我使用 AsyncTask 方法检索到的 JSON 数组,

我有一个数组变量,它在 OnCreate 之前声明并用一些值初始化,

String [] str=new String[100];

在for循环中解析json数组时存储在tat数组变量中,

str[i]=c.getString(TAG_NAME);

完美存储,我做了 Log,它也在 logcat 中显示,

但问题是当我像这样在我的函数之外使用“str”数组变量时,

void func()
{
List<String> top250 = new ArrayList<String>();
for(int x=0;x<str.length;x++)
{

    top250.add(str[x]);

}
}

str 变量只存储字符串“null”作为初始化内存。

它存储“null” 100 次。

那么如何获取AsyncTask内部doInBackground方法处理的值呢?

【问题讨论】:

  • 首先你应该解释你使用的一些术语。 “全局”变量是什么意思?它是实例变量吗? “像这样在我的函数之外使用“str”数组变量是什么意思?尽管我不完全理解您的问题,但我认为您正在尝试执行 asynctask 并且“就在 )}.execute(); 之后”你调用其他函数。这将不起作用,因为 asynctask 在单独的线程中运行,这就是为什么您在 asynctask 执行后立即获得 null 的原因。您应该在 doInBackground 或 onPostExecute(...) 中使用 str 数组完成所有工作。

标签: android android-asynctask


【解决方案1】:

您可以在 post execute() 中返回您的字符串列表

private class LongOperation extends AsyncTask<String, Void, List<String>> {

    @Override
    protected List<String> doInBackground(String... params) {

        List<String> top250 = new ArrayList<String>();
        for(int x=0;x<str.length;x++)
        {

            top250.add(str[x]);

        }

        return top250;
    }

    @Override
    protected void onPostExecute(List<String> result) {

        //validate result and assign to something useful like a field

    }

    @Override
    protected void onPreExecute() {}

    @Override
    protected void onProgressUpdate(Void... values) {}
}

然后您可以在验证结果后将结果分配给类中的某个字段。

【讨论】:

  • 从列表到数组不是问题,因为您可以轻松转换。 Foo[] 数组 = list.toArray(new Foo[list.size()]);
  • @Brendon 谢谢。看看 Google 的 GSON。它将为您节省大量 JSON 反序列化工作,并使事情进展得更快。 code.google.com/p/google-gson
  • 如何实现这个gson?有项目链接吗? @格雷厄姆
  • @Brendon 看到我的链接code.google.com/p/google-gson,你可以下载并包含在你的项目中。
  • 我已成功获取值,谢谢,但我如何获取两个不同的变量?
【解决方案2】:

编辑: Asyntask 示例供参考Code and concept here

众所周知,AsynTask 有三个参数

new `AsynTask < Params , Progress , Result >`

你可以这样做:

new AsyncTask<Void, Void, String>(){

                @Override
                protected String doInBackground(Void... params) {

                             //Parse your json here
                             //You will get this result into result of onPostExceute()

                                       return json;
                }

                @Override
                protected void onPostExecute(String result) {
                                        //Use your result here
                    super.onPostExecute(result);
                }
                      }.execute();

使用这个你可以得到你的字符串(这里)或者你定义的任何东西到AsynTask的结果部分

希望对你有帮助

【讨论】:

    猜你喜欢
    • 2015-01-25
    • 1970-01-01
    • 1970-01-01
    • 2016-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-01
    相关资源
    最近更新 更多