完成线程后设置文本

时间:2015-06-01 19:33:07

标签: android

我有问题。为什么setText方法中的数据设置不正确?

MainActivity类

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textViewCity = (TextView) findViewById(R.id.text_view_city_name);
        textViewTemperature = (TextView) findViewById(R.id.text_view_current_temperature);

        new Thread(new WeatherYahoo()).start();

        Weather weather = new Weather();

        textViewCity.setText(weather.getCity());
        textViewTemperature.setText(String.valueOf(weather.getTemperature()));
    }

在Weather类中下载并正确设置数据(我使用JSON),但在屏幕上显示textViewCity为空字符串,textViewTemperature为0。

2 个答案:

答案 0 :(得分:3)

您的活动中的所有内容都在UI线程上执行。所以这种情况正在发生,因为您在使用Thread开始新的WeatherYahoo后尝试设置文本,因此您不会等待结果,而只是输出空值。我建议您使用AsyncTask进行此类调用并在UI线程上检索结果。因此,您可以使用WeatherYahoo方法在doInBackground()类中完成所有工作,并以onPostExecute()方法输出结果。举个例子:

 private class WeatherYahooTask extends AsyncTask<Void, Void, Weather> {
     protected Weather doInBackground(Void... params) {
         // do any kind of work you need (but NOT on the UI thread)
         // ...
         return weather;
     }

     protected void onPostExecute(Weather weather) {
        // do any kind of work you need to do on UI thread
        textViewCity.setText(weather.getCity());
        textViewTemperature.setText(String.valueOf(weather.getTemperature()));
     }
 }

答案 1 :(得分:0)

您有两个选择:

  • 等待线程使用以下命令完成json的下载:

    {{1}}
  • 或者你可以使用Yuriy发布的asynctasks。