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

使用带有变量的aSyncTask

公孙阳羽
2023-03-14

我正在做一个简单的天气应用程序,我有一个问题,通过AsyncTask读取变量。我是andorid编程的初学者,所以我要求理解。因此,我想将变量“latitude”和“longitude”从place picker中选择到asynctask.execute(“latitude”,“longitude”)中,并刷新屏幕以显示新位置的天气。但我注意到,当我在代码中不是通过变量(例如asynctask.execute(“52.2296756”,“38,343 5546”))放入坐标时,这个位置的天气会在使用Place picker后出现。我还添加了outprint来检查这些变量,它们看起来还不错。

  public class MainActivity extends AppCompatActivity {


        TextView cityField, detailsField, currentTemperatureField, 
        humidity_field, pressure_field, weatherIcon, updatedField;
        ImageView mPlacePicker;
        Typeface weatherFont;
        int PLACE_PICKER_REQUEST = 1;
        String latitude;
        String longitude;


        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            getSupportActionBar().hide();
            setContentView(R.layout.activity_main);
            mPlacePicker = (ImageView) findViewById(R.id.place_picker);
            mPlacePicker.setOnClickListener(new View.OnClickListener() {

                @Override
                public void onClick(View view) {
                    PlacePicker.IntentBuilder builder = new 
                    PlacePicker.IntentBuilder();
                    Intent intent;
                    try {
                        intent = builder.build(MainActivity.this);
                        startActivityForResult(intent, PLACE_PICKER_REQUEST);
                    } catch (GooglePlayServicesRepairableException e) {
                        e.printStackTrace();
                    } catch (GooglePlayServicesNotAvailableException e) {
                        e.printStackTrace();
                    }
                }
            });

        }

        public void onActivityResult(int requestCode, int resultCode, Intent 
        data) {
            if (requestCode == PLACE_PICKER_REQUEST) {
                if (resultCode == RESULT_OK) {
                    Place place = PlacePicker.getPlace(this, data);
                    String address = String.format("Place %s", place.getAddress());
                    Toast.makeText(this, address, Toast.LENGTH_LONG).show();
                    LatLng latLng = place.getLatLng();
                    latitude = String.valueOf(latLng.latitude);
                    longitude = String.valueOf(latLng.longitude);
                    //System.out.println(latitude);
                    //System.out.println(longitude);
                }
            }
            weatherFont = Typeface.createFromAsset(getApplicationContext().getAssets(), "fonts/weathericons-regular-webfont.ttf");

            cityField = (TextView) findViewById(R.id.city_field);
            updatedField = (TextView) findViewById(R.id.updated_field);
            detailsField = (TextView) findViewById(R.id.details_field);
            currentTemperatureField = (TextView) findViewById(R.id.current_temperature_field);
            humidity_field = (TextView) findViewById(R.id.humidity_field);
            pressure_field = (TextView) findViewById(R.id.pressure_field);
            weatherIcon = (TextView) findViewById(R.id.weather_icon);
            weatherIcon.setTypeface(weatherFont);
            mPlacePicker = (ImageView) findViewById(place_picker);


            Function.placeIdTask asyncTask = new Function.placeIdTask(new Function.AsyncResponse() {
                public void processFinish(String weather_city, String weather_description, String weather_temperature, String weather_humidity, String weather_pressure, String weather_updatedOn, String weather_iconText, String sun_rise) {

                    cityField.setText(weather_city);
                    updatedField.setText(weather_updatedOn);
                    detailsField.setText(weather_description);
                    currentTemperatureField.setText(weather_temperature);
                    humidity_field.setText("Humidity: " + weather_humidity);
                    pressure_field.setText("Pressure: " + weather_pressure);
                    weatherIcon.setText(Html.fromHtml(weather_iconText));

                }
            });
            System.out.println('"' + latitude + '"');
            System.out.println('"' + longitude + '"');
            asyncTask.execute('"' + latitude + '"', '"' + longitude + '"'); //  asyncTask.execute("Latitude", "Longitude")
        }


    }

这是doInBackground的二等

    public class Function {



    private static final String OPEN_WEATHER_MAP_URL =
            "http://api.openweathermap.org/data/2.5/weather?lat=%s&lon=%s&units=metric";

    private static final String OPEN_WEATHER_MAP_API = "3b30fbc239f6a1ed664220635330aa46";

    public static String setWeatherIcon(int actualId, long sunrise, long sunset){
        int id = actualId / 100;
        String icon = "";
        if(actualId == 800){
            long currentTime = new Date().getTime();
            if(currentTime>=sunrise && currentTime<sunset) {
                icon = "&#xf00d;";
            } else {
                icon = "&#xf02e;";
            }
        } else {
            switch(id) {
                case 2 : icon = "&#xf01e;";
                    break;
                case 3 : icon = "&#xf01c;";
                    break;
                case 7 : icon = "&#xf014;";
                    break;
                case 8 : icon = "&#xf013;";
                    break;
                case 6 : icon = "&#xf01b;";
                    break;
                case 5 : icon = "&#xf019;";
                    break;
            }
        }
        return icon;
    }



    public interface AsyncResponse {

        void processFinish(String output1, String output2, String output3, String output4, String output5, String output6, String output7, String output8);
    }


    public static class placeIdTask extends AsyncTask<String, Void, JSONObject> {

        public AsyncResponse delegate = null;//Call back interface

        public placeIdTask(AsyncResponse asyncResponse) {
            delegate = asyncResponse;//Assigning call back interfacethrough constructor
        }

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

            JSONObject jsonWeather = null;
            try {
                jsonWeather = getWeatherJSON(params[0], params[1]);
            } catch (Exception e) {
                Log.d("Error", "Cannot process JSON results", e);
            }


            return jsonWeather;
        }

        @Override
        protected void onPostExecute(JSONObject json) {
            try {
                if(json != null){
                    JSONObject details = json.getJSONArray("weather").getJSONObject(0);
                    JSONObject main = json.getJSONObject("main");
                    DateFormat df = DateFormat.getDateTimeInstance();


                    String city = json.getString("name").toUpperCase(Locale.US) + ", " + json.getJSONObject("sys").getString("country");
                    String description = details.getString("description").toUpperCase(Locale.US);
                    String temperature = String.format("%.2f", main.getDouble("temp"))+ "°";
                    String humidity = main.getString("humidity") + "%";
                    String pressure = main.getString("pressure") + " hPa";
                    String updatedOn = df.format(new Date(json.getLong("dt")*1000));
                    String iconText = setWeatherIcon(details.getInt("id"),
                            json.getJSONObject("sys").getLong("sunrise") * 1000,
                            json.getJSONObject("sys").getLong("sunset") * 1000);

                    delegate.processFinish(city, description, temperature, humidity, pressure, updatedOn, iconText, ""+ (json.getJSONObject("sys").getLong("sunrise") * 1000));

                }
            } catch (JSONException e) {
                //Log.e(LOG_TAG, "Cannot process JSON results", e);
            }

        }

    }

    public static JSONObject getWeatherJSON(String lat, String lon){
        try {
            URL url = new URL(String.format(OPEN_WEATHER_MAP_URL, lat, lon));
            HttpURLConnection connection =
                    (HttpURLConnection)url.openConnection();

            connection.addRequestProperty("x-api-key", OPEN_WEATHER_MAP_API);

            BufferedReader reader = new BufferedReader(
                    new InputStreamReader(connection.getInputStream()));

            StringBuffer json = new StringBuffer(1024);
            String tmp="";
            while((tmp=reader.readLine())!=null)
                json.append(tmp).append("\n");
            reader.close();

            JSONObject data = new JSONObject(json.toString());

            // This value will be 404 if the request was not
            // successful
            if(data.getInt("cod") != 200){
                return null;
            }

            return data;
        }catch(Exception e){
            return null;
        }
    }
}

共有3个答案

公孙英飙
2023-03-14
    //Add async task

    private class SampleAsyncTask extends AsyncTask<String, Void, String> {

    @Override
    protected String doInBackground(String... params) {
        // this might take a while ...
        // Do your task over here
        // Use parameterlike this
        latitude=params[0];
        longitude=params[1];

        return "Success";

    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);
    }
}
//Call asyc task
new SampleAsyncTask().execute(String.valueOf(latitude),String.valueOf(longitude));

希望这对你有帮助。快乐编码

丁翰海
2023-03-14

您可以为类AsyncTask使用构造函数

类似这样的事情:

class placeIdTask extends AsynckTask<Void,Void,Void>{
    Double latitude;
    Double longitude;
public placeIdTask(Double latitude, Double longitude){

this.latitude = latitude;
this.longitude=longitude;
}

...//implement doInbackground using latitude and longitude 

}

或者只是像这样更改泛型类的类型

class placeIdTask extends AsynckTask<Double,Void,Void>{
   @Override
        protected Void doInBackground(Double... arg0) {
       Double latitude = arg0[0];
       Double longitude = arg0[1];
         ...   }
... }

我建议你用Double代替String

希望对你有帮助

傅恺
2023-03-14

删除多余的“”。你不需要那些。

asyncTask.execute(latitude,longitude);
 类似资料:
  • 我试图表示一个树状递归数据结构,其中每个节点可能是两种不同数据类型中的一种。我使用boost变体来“容纳”可能出现在每个节点上的两种类型。 但是,我遇到了一个问题。我严格使用“using”指令声明所有这些类型,因此当我到达节点的递归性质时,它会失败,因为typedef/using可能不会使用递归。 如何做到这一点? 我已经探索过使用boost::make_recursive_variant,但它创

  • 问题内容: 我正在尝试使用NSLocalizedString本地化我的应用程序。当我导入XLIFF文件时,大多数工作都像一个超级按钮,但是有些却没有,有些字符串没有本地化。我注意到问题出在NSLocalizedString中,其中包含一些变量,例如: 要么 也许这不是这类东西的正确语法。有人可以向我解释如何迅速做到这一点?非常感谢你。 问题答案: 您可以在中使用format参数,因此您的示例如下所

  • 问题内容: 我有以下代码在控制器中设置变量: 在百里香视图中,我想构造一个带有动作网址的表单: 任何想法如何实现这一目标?我没看过百里香的文档。 问题答案: 正如user482745在注释(现在已删除)中建议的那样,我之前建议的字符串连接 在某些网络环境下会失败。 Thymeleaf用来解析表达式。在内部,使用。它的javadoc状态 为了进行可靠的会话跟踪,应通过此方法运行servlet发出的所

  • 我在控制器中设置变量的代码如下: 在thymeleaf视图中,我想用action url构建一个表单: 有什么想法如何实现这一点?我读过thymeleaf留档没有运气。

  • 我有两个表:Person(person_id,name)和另一个表Contacts(person_id,phone_type,phone_no)。 例如,contacts表的行被透视以形成视图的列(列的数量将根据'phone_types'列的不同值而变化)。 有什么方法可以透视contacts表,但使用动态pivot-in-sublic,类似

  • 问题内容: 这不起作用。任何提示或技巧都将不胜感激。 问题答案: 您需要准备好的声明,请查看本教程。