如何在android中调用Asynctask

时间:2013-12-04 00:46:11

标签: android

我正在编写一个Android应用程序,我使用Aysnctask来使用openWeatherAPI获取当前天气。我怎么能调用Aysnctask类。

这是我写的Aysnctask类:

private class getWeather extends AsyncTask<String[], Void, String[]>{

    @Override
    protected String[] doInBackground(String[]... params) {
        // TODO Auto-generated method stub
        try {

             String Url1="http://api.openweathermap.org/data/2.5/weather?lat="+currentLatitude+"&lon="+currentLongitude;
             s1=getJson(Url1);



             if(s1!=null){


                 JSONObject jObj1 = new JSONObject(s1);

                 Tem=  jObj1.getJSONObject("main").getDouble("temp");
                 pressure=jObj1.getJSONObject("main").getDouble("pressure");
                 humm=jObj1.getJSONObject("main").getDouble("humidity");
                 wind=jObj1.getJSONObject("wind").getDouble("speed");
                 desc=jObj1.getJSONObject("weather").getDouble("description");

                      double tem_c=Tem-273.15;
                    String t=Double.toString(tem_c);
                    results[0]=t;
                    results[1]=Double.toString(pressure);
                    results[2]=Double.toString(humm);
                    results[3]=Double.toString(wind);
                    results[4]=Double.toString(desc);

             }

        } catch (Exception e) {
            // TODO: handle exception
        }
        return results;
    }//do in background


    @Override
    protected void onPostExecute(String[] results) {    
        temp.setText(results[0]+"°C");
        hum.setText(results[1]+ "%");
        press.setText(results[2]+ " hPa");
        windSpeed.setText(results[3]+ " mps");
        condDescr.setText(results[4]);

    }



}

当我按下按钮时,我想获得当前纬度和经度的天气,但我不知道如何执行该课程

3 个答案:

答案 0 :(得分:0)

试试这个

getWeather gt= new getWeather();

gt.execute(new String{currentLatitude,currentLongitude});

答案 1 :(得分:0)

根据Android docs here,你有很多例子,你可以这样做:

new GetWeather().execute(currentLatitude,currentLongitude);

我个人会回避对它的引用,而是发送你需要的东西或使用听众。另外,请将您的课程资本化:)

您可以在doInBackGround

中同样访问它们
String latitutde= params[0];
String longitude = params[1];

您可以查看的文档示例如下:

new DownloadFilesTask().execute(url1, url2, url3);

正如您所看到的,传递了您需要的许多参数,它只能在您提到的第一个通用参数的数组中访问。在您的情况下,它是一个String数组,因此您只发送Strings

答案 2 :(得分:0)

试试这个..

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
         new getWeather(currentLatitude,currentLongitude).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, new String[]{null});   
else
         new getWeather(currentLatitude,currentLongitude).execute(new String[]{null});

并将构造函数添加到异步任务

        String currentLatitude;
        String currentLongitude;

        //  constructor
        @SuppressWarnings("rawtypes")
        public getWeather(String currentLatitude, String currentLongitude) {
            this.currentLatitude = currentLatitude;
            this.currentLongitude = currentLongitude;
        }

编辑1:

您不能像这样String t=Double.toString(tem_c);

解析double到字符串

您需要解析如下代码。

                String t = String.valueOf(tem_c);
                results[0] = t;
                results[1] = String.valueOf(pressure);
                results[2] = String.valueOf(humm);
                results[3] = String.valueOf(wind);
                results[4] = String.valueOf(desc);