当前位置: 首页 > 知识库问答 >
问题:

AsyncTask doInBackground返回多个字符串

屠兴旺
2023-03-14

我正试图在android工作室中建立一个非常基本的天气应用程序。我正在使用AsyncClass返回多个字符串。

正如您在代码中看到的,我使用了一个名为“wrapper”的类,用于存储字符串,这样我就可以返回一个类对象,并在AsyncTask的onPostExecute方法中使用它。我面临的问题是,当我测试应用程序时,所有返回的字符串都是未定义的(包装类的默认值)。这意味着没有在doInBackground方法中更新字符串,我似乎想不出原因!

我得活动

    @Override
    public void onConnectionFailed(ConnectionResult connectionResult) {
        Log.i(MainActivity.class.getSimpleName(), "Can't connect to Google Play Services!");
    }
    private class Wrapper
    {
          String Temperature = "UNDEFINED";
         String city = "UNDEFINED";
         String country = "UNDEFINED";
    }

    private class GetWeatherTask extends AsyncTask<String, Void, Wrapper> {
        private TextView textView;

        public GetWeatherTask(TextView textView) {
            this.textView = textView;
        }

        @Override
        protected Wrapper doInBackground(String... strings) {
            Wrapper w = new Wrapper();
            String Temperature = "x";
            String city = "y";
            String country = "z";

            try {
                URL url = new URL(strings[0]);
                HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();

                InputStream stream = new BufferedInputStream(urlConnection.getInputStream());
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(stream));
                StringBuilder builder = new StringBuilder();

                String inputString;
                while ((inputString = bufferedReader.readLine()) != null) {
                    builder.append(inputString);
                }

                JSONObject topLevel = new JSONObject(builder.toString());
                JSONObject main = topLevel.getJSONObject("main");
                JSONObject cityobj = topLevel.getJSONObject("city");
                Temperature = String.valueOf(main.getDouble("temp"));
                city = cityobj.getString("name");
               country = cityobj.getString("country");

                w.Temperature= Temperature;
                w.city= city;
                w.country=country;

                urlConnection.disconnect();
            } catch (IOException | JSONException e) {
                e.printStackTrace();
            }
            return w;
        }

        @Override
        protected void onPostExecute(Wrapper w) {
            textView.setText("Current Temperature: " + w.Temperature + " C" + (char) 0x00B0
                       +"\n" + "Current Location: "+ w.country +"\n" + "City: "+  w.city );
        }
    }
}

更新:

结果我在代码中使用了错误的url,我使用的是:http://api.openweathermap.org/data/2.5/weather?lat=%f&lon=%f&units=%s&appid=%s

相反,我应该用:

-AKA我应该用预测而不是天气

共有1个答案

俞衡虑
2023-03-14

您的错误从这里开始

JSONObject main = topLevel.getJSONObject("main");

可能是因为TopLevel对象没有“main”键。

{  
   "city":{  },
   "cod":"200",
   "message":0.1859,
   "cnt":40,
   "list":[  ]
}

将您的JSON扔到这里。https://jsonformatter.curiousconcept.com/

String city = "undefined";
String country = "undefined";
List<Double> temperatures = new ArrayList<Double>();

try {
    JSONObject object = new JSONObject(builder.toString());
    JSONObject jCity = object.getJSONObject("city");
    city = jCity.getString("name");
    country = jCity.getString("country");

    JSONArray weatherList = object.getJSONArray("list");
    for (int i = 0; i < weatherList.length(); i++) {
        JSONObject listObject = weatherList.getJSONObject(i);
        double temp = listObject.getJSONObject("main").getDouble("temp");
        temperatures.add(temp);
    }

} catch (JSONException e) {
    e.printStackTrace();
}

return new Wrapper(city, country, temperatures);
 类似资料:
  • 我试图使用Apache和MySQL XAMPP数据库为我的论坛建立一个登录页面,但它多次返回回显字符串,我知道它会遍历数据库中的所有行,检查是否为真,它返回的是“无效的用户名或密码!”直到找到正确的登录信息,然后返回“welcome”(欢迎)。 它是如何做到的,它只返回一个不正确的和正确的字符串?。

  • 我是新的java和卡在如何返回已输入的整个地址,因为我目前只返回第一个字。下面是代码: 如果有任何帮助,我将不胜感激。

  • 问题内容: 好的,这就是我的for子手游戏代码,我唯一要做的就是让我的程序将其中一个单词随机化,这应该在方法中成功完成。但是我唯一的问题是让String变量 “ word” 返回到主类(在主类中的所有 “ word” 变量下面都有错误)。 如果我可以通过这种方法获得另一种帮助,或者从列表中产生随机单词的另一种方法,那将是惊人的。 问题答案: 在Java中,参数是通过值而不是引用传递的。因此,您不能

  • 这个问题不是如何通过多个字段进行聚合,我们可以使用子聚合。 如果你知道SQL,我可以给你一个完美的解释: 我们能在Elasticsearch中实现这一点吗? 谢谢。

  • 我用的是parse.com。每个包里面都有很多钻子,每个品类里面都有很多包。 我卡住了。然后(函数(result,result2,result3)在最后一行。promise可以有多个promise,它是可变的。有没有一种方法可以写出如下内容: 谢谢!

  • 问题内容: 我有一个返回字符串的Java实例方法,我正在C ++中通过JNI调用此方法。我写了以下代码: 如何获取字符串并将其转换为const char *? 我的程序在访问冲突为0x00000000的最后一行崩溃。returnString不是NULL。 问题答案: 根据,最后一个参数是的指针。 更改 至 或者更好的是,返回一个 我建立了一个类似的简单示例,到目前为止,代码看起来还不错。 虽然,有