2016-09-02 2 views
0

Я пытаюсь вызвать метод updateDisplay через цикл for, чтобы установить текст для соответствующего индекса, но на выходе запускается только пятый индексный код.Функция не получила право называться

Вот цикл for, который я вызываю в onCreateView() моего фрагмента;

private int mIndexofDays; 

for(int i =1; i < 6; i++) { 
     DateTime nextday = mDateTime.plusDays(i); 
     long time = nextday.getMillis()/1000; 
     getForecast(mLattitude, mLongitude, time); 
     mIndexofDays = i; 
    } 

Вот метод getForecast():

private void getForecast(double latitude, double longitude, long time) 
{ 
    String apiKey = getResources().getString(R.string.api_key); 


    String forecastUrl = "https://api.forecast.io/forecast/" + apiKey + 
      "/" + latitude + "," + longitude + "," + time; 





      OkHttpClient client = new OkHttpClient(); 
      Request request = new Request.Builder() 
        .url(forecastUrl) 
        .build(); 
      Call call = client.newCall(request); 
      call.enqueue(new Callback() { 
       @Override 
       public void onFailure(Call call, IOException e) { 
        getActivity().runOnUiThread(new Runnable() { 
         @Override 
         public void run() { 



         } 
        }); 


       } 

       @Override 
       public void onResponse(Call call, Response response) throws IOException { 
        getActivity().runOnUiThread(new Runnable() { 
         @Override 
         public void run() { 

         } 
        }); 

        try { 
         String jsonData = response.body().string(); 
         Log.v(TAG, jsonData); 
         if (response.isSuccessful()) { 

          mWeather = getCurrentDetails(jsonData); 
          getActivity().runOnUiThread(new Runnable() { 
           @Override 
           public void run() { 
            Log.d(TAG, "Running...."); 
            updateDisplay(); 


           } 
          }); 

         } else { 
          Log.d(TAG, "Response not successful"); 
         } 
        } catch (IOException e) { 
         Log.e(TAG, " IOException caught: ", e); 
        } catch (JSONException e) { 
         Log.e(TAG, "JSON exception caught: ", e); 

        } 
       } 
      }); 
     } 

А вот метод updateDisplay():

частная пустота updateDisplay() {

if(mIndexofDays == 1) { 
     mDayOfWeek1.setText(mDateTime.plusDays(1).dayOfWeek().getAsShortText()); 
     Drawable drawable = getResources().getDrawable(mWeather.getIconId()); 
     mDayOfWeekImage1.setImageDrawable(drawable); 
     mHighTemp1.setText(mWeather.getTemperatureMax() + ""); 
     mLowTemp1.setText(mWeather.getTemperatureMin() + ""); 
    } 
    if(mIndexofDays == 2) { 
     mDayOfWeek2.setText(mDateTime.plusDays(2).dayOfWeek().getAsShortText()); 
     Drawable drawable = getResources().getDrawable(mWeather.getIconId()); 
     mDayOfWeekImage2.setImageDrawable(drawable); 
     mHighTemp2.setText(mWeather.getTemperatureMax() + ""); 
    } 

    if(mIndexofDays == 3) { 
     mDayOfWeek3.setText(mDateTime.plusDays(3).dayOfWeek().getAsShortText()); 
     Drawable drawable = getResources().getDrawable(mWeather.getIconId()); 
     mDayOfWeekImage3.setImageDrawable(drawable); 
     mHighTemp3.setText(mWeather.getTemperatureMax() + ""); 
    } 
    if(mIndexofDays == 4) { 
     mDayOfWeek4.setText(mDateTime.plusDays(4).dayOfWeek().getAsShortText()); 
     Drawable drawable = getResources().getDrawable(mWeather.getIconId()); 
     mDayOfWeekImage4.setImageDrawable(drawable); 
     mHighTemp4.setText(mWeather.getTemperatureMax() + ""); 
    } 
    if(mIndexofDays == 5) { 
     mDayOfWeek5.setText(mDateTime.plusDays(5).dayOfWeek().getAsShortText()); 
     Drawable drawable = getResources().getDrawable(mWeather.getIconId()); 
     mDayOfWeekImage5.setImageDrawable(drawable); 
     mHighTemp5.setText(mWeather.getTemperatureMax() + ""); 

    } 
    else 
    { 
     Log.d(TAG, "Index to high!!!"); 
    } 
} 

С logs Я вижу, что вызов «Running» вызывается, но updateDisplay никогда не обновляется для 1-4 индексов только для 5-го индекса.

Я очень начинающий программист, поэтому, пожалуйста, расскажите мне, что не так с моим стилем и лучшими методами, чтобы делать то, что я пытаюсь сделать.

ответ

0

изменить updateDisplay и передать копию mIndexofDays в качестве параметра, и это должно сработать. Я могу предоставить фактический код реализации, но я рекомендую вам попробовать сначала.

надеюсь, что это помогает :)

+0

Я уже пробовал это решение, но это не помогло мне, возможно, я делал это неправильно, вы можете мне показать, как? –

+0

Nvm, я попробовал, и теперь он работает, но есть еще одна проблема, что я думаю с api. Я просто спрошу его здесь, в случае, если кто-нибудь сможет дать представление. Когда я обновляю приложение или перезагружаю значения для погоды, они выходят иногда очень неточно. Например, перезагрузка завтрашней погоды иногда появляется как -7, а иногда и с правильной суммой. –

0

изменить свой цикл, как этот

for(int i =1; i < 6; i++) { 
     mIndexofDays = i; 
     DateTime nextday = mDateTime.plusDays(i); 
     long time = nextday.getMillis()/1000; 
     getForecast(mLattitude, mLongitude, time, mIndexofDays); // new parameter: mIndexofDays 
} 

поймать mIndexofDays параметров в методе getForecast и передать его через метод updateDisplay. Затем используйте значение mIndexofDays для сравнения в ваших операторах if ... else. Вы можете использовать метод журнала или метод задержки, чтобы проверить, действительно ли он работает или нет.

0

Ну, проблема в том, что ваш updateDisplay() вызывается только тогда, когда вы получаете ответ в onResponse(). Теперь, к тому времени, когда это произойдет, ваш цикл уже закончился, а значение mIndexofDays - 5. Чтобы исправить эту проблему один из вещей, которые вы можете сделать, это передать значение mIndexofDays вашему getForecast() метода:

private void getForecast(double latitude, double longitude, long time, int indexOfDays) { 
    ... 
    updateDisplay(numberOfDays); 
    ... 
} 

Вы также должны изменить свой updateDisplay() метод:

private void updateDisplay(int indexOfDays) { 
    ... 
} 

Кроме того, избавиться от переменной экземпляра mIndexOfDays, так как вы [вероятно] ничего не нуждаетесь в этом.

Смежные вопросы