2012-04-16 7 views
1

私はAndroid用の天気アプリケーションを作成していますが、runOnUiThreadのスレッドから最終的な変数を使用しようとしています。しかし、私はこれをすることは許されていません。runOnUiThreadで非最終変数を使用する

私は間違っていますか?

下位アクティビティ全体のコードです。スレッドはyr.noからXMLを解析しています。

public class WeatherActivity extends Activity implements OnClickListener { 

ImageView forecastImage; 
TextView updateWeatherText; 
TextView temperatureText; 
TextView cloudinessText; 
TextView windspeedText; 
TextView precipitationText; 

Thread updateWeather = new Thread(new GetWeather()); 
Thread updateWeatherFromButton = new Thread(new GetWeather()); 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    forecastImage = (ImageView) findViewById(R.id.forecastIcon); 

    updateWeatherText = (TextView) findViewById(R.id.updatingWeatherText); 

    temperatureText = (TextView) findViewById(R.id.temperatureText); 
    cloudinessText = (TextView) findViewById(R.id.cloudinessText); 
    windspeedText = (TextView) findViewById(R.id.windspeedText); 
    precipitationText = (TextView) findViewById(R.id.precipitationText); 

    updateWeather.start(); 

    Button refreshButton = (Button) findViewById(R.id.refreshButton); 
    refreshButton.setOnClickListener(this); 
} 

class GetWeather implements Runnable { 

    public void run() { 

     try { 

      String temp; 
      String windspeed; 
      String cloudiness; 
      String precipitation; 


      URL weatherURL = new URL(
        "http://api.yr.no/weatherapi/locationforecast/1.8/?lat=62.39;lon=17.30"); 

      XmlPullParserFactory parserFactory = XmlPullParserFactory 
        .newInstance(); 
      XmlPullParser parser = parserFactory.newPullParser(); 

      parser.setInput(weatherURL.openStream(), null); 

      updateWeatherText.setText("Updating..."); 
      int parserEvent = parser.getEventType(); 
      while (parserEvent != XmlPullParser.END_DOCUMENT) { 

       switch (parserEvent) { 

       case XmlPullParser.TEXT: 
        String tag = parser.getName(); 

        if (tag.compareTo("temperature") == 0) { 
         temp = parser.getAttributeValue(
           null, "value") + " 'C"; 
        } else if (tag.compareTo("windSpeed") == 0) { 
         windspeed = parser.getAttributeValue(
           null, "mps") + " m/s"; 

        } else if (tag.compareTo("cloudiness") == 0) { 
         if (Integer.parseInt(parser.getAttributeValue(null, 
           "percent")) >= 0 
           && Integer 
             .parseInt(parser.getAttributeValue(
               null, "percent")) <= 12.5) { 
          cloudiness = "Klart"; 
         } else if (Integer.parseInt(parser 
           .getAttributeValue(null, "percent")) > 12.5 
           && Integer 
             .parseInt(parser.getAttributeValue(
               null, "percent")) < 25) { 
          cloudiness = "Mestadels klart"; 
         } else if (Integer.parseInt(parser 
           .getAttributeValue(null, "percent")) >= 25 
           && Integer 
             .parseInt(parser.getAttributeValue(
               null, "percent")) < 75) { 
          cloudiness = "Växlande molnighet"; 
         } else if (Integer.parseInt(parser 
           .getAttributeValue(null, "percent")) >= 75 
           && Integer 
             .parseInt(parser.getAttributeValue(
               null, "percent")) < 87.5) { 
          cloudiness = "Mestadels mulet"; 
         } else if (Integer.parseInt(parser 
           .getAttributeValue(null, "percent")) >= 87.5 
           && Integer 
             .parseInt(parser.getAttributeValue(
               null, "percent")) <= 100) { 
          cloudiness = "Mulet"; 
         } 

        } else if (tag.compareTo("precipitation") == 0) { 
         if (Integer.parseInt(parser.getAttributeValue(null, "minvalue")) > 0) forecastImage.setBackgroundResource(R.drawable.rain); 
         precipitation = "Mellan " 
             + parser.getAttributeValue(null, 
               "minvalue") 
             + " mm och " 
             + parser.getAttributeValue(null, 
               "maxvalue") + " mm"; 
        } 
        break; 
       } 
       parserEvent = parser.next(); 

       runOnUiThread(new Runnable() { 

        public void run() { 
         temperatureText.setText(temp); 
         windspeedText.setText(windspeed); 
         cloudinessText.setText(cloudiness); 
         precipitationText.setText(precipitation); 

         if (cloudiness.compareTo("Klart") == 0){ 
          forecastImage.setBackgroundResource(R.drawable.sunny); 
         } else if (cloudiness.compareTo("Mestadels klart") == 0) { 
          forecastImage.setBackgroundResource(R.drawable.sunny); 
         } 
          else if (cloudiness.compareTo("Växlande molnighet") == 0) { 
           forecastImage.setBackgroundResource(R.drawable.cloudy); 
         } else if (cloudiness.compareTo("Mestadels mulet") == 0) { 
          forecastImage.setBackgroundResource(R.drawable.overcast); 
         } else if (cloudiness.compareTo("Mulet") == 0) { 
          forecastImage.setBackgroundResource(R.drawable.overcast); 
         }       
        } 
       }); 
      } 
      updateWeatherText.setText("Last updated: " 
        + System.currentTimeMillis()); 

     } catch (Exception e) { 
     } 
    } 
} 

public void onClick(View v) { 

    switch (v.getId()) { 

    case R.id.refreshButton: 
     updateWeatherFromButton.start(); 

    } 
} 

答えて

1

すでに指摘しているように、あなたはできません。 1つの回避策は、最終変数を最終変数に再割り当てしてから、Runnableを定義することです。

String aNonFinalString = "a"; 
aNonFinalString = "b"; 

final String aFinalString = aNonFinalString; 

runOnUiThread(new Runnable() { 
    public void run() { 
     useYourString(aFinalString); 
    } 
} 
+1

これは間違っています。 aNonFinalStringの値は、実行メソッドが実行されるまでに変更されることがあります。それが「最終的」でなければならない理由があります。 – Anirudh

+0

@Anirudhあなたが何を意味しているか分かりません。私はrunnableでaNonFinalStringを使用しません。これは全体のポイントです。 – assylias

+0

私は、開発者@ user1258829が、おそらく '古い'値、すなわち最終的なString aFinalString = aNonFinalStringを期待していないと言うことを試みていました。実行可能ファイルが実際に実行されるとき。 aNonFinalStringは、いくつかのロジックに基づいて変更することができます。しかし、実行可能ファイルは、最後の変数で値のスナップショットを提供するだけです。 – Anirudh

関連する問題