2016-09-02 108 views
0

我试图通过for循环来调用updateDisplay方法来设置相应索引的文本,但在输出中只有第5个索引代码正在运行。函数调用不正确

这是我在我的片段的onCreateView()调用的for循环;

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!!!"); 
    } 
} 

从日志我可以看到“正在运行”正在调用,但updateDisplay从不更新1-4索引仅用于第5个索引。

我是一个非常新手的程序员,所以请告诉我什么是我的风格和更好的方法来做我想做的事。

回答

0

修改updateDisplay并将mIndexofDays的副本作为参数传递,这应该起作用。我可以提供实际的实现代码,但我鼓励你先尝试一下。

希望这有助于:)

+0

我已经尝试过这种解决方案,但那不适合我,也许我做错了,你能告诉我怎么做吗? –

+0

Nvm,我试过了,它现在可以工作,但还有另一个问题,我认为是与api。如果有人能提供见解,我会在此提问。当我刷新应用程序或重新加载天气的值时,他们有时非常不准确。例如,重新加载明天的天气有时显示为-7,有时显示正确的数量。 –

0

改变你的for循环这样

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语句中进行比较。您可以使用Log方法或时间延迟方法来检查它是否实际工作。

0

嗯,问题是只有当您收到onResponse()的响应时才会调用您的updateDisplay()。现在,到这种情况发生时,您的循环已经结束,并且mIndexofDays的值为5。要解决这个问题,你可以做的事情之一就是给mIndexofDays值传递给你的getForecast()方法:

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

你还需要改变你的updateDisplay()方法:

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

而且,摆脱mIndexOfDays实例变量,因为你[很可能]不需要它在任何地方。