2017-07-29 59 views
0

我一直在研究一个天气应用程序,我知道它并不完美(我刚刚开始使用android开发),但我不确定如何更新每个启动时的天气信息。我试图保持onCreate()方法中的所有内容,但它只是“粘”在我第一次启动时使用的位置和条件上。如何使用onCreate()更新天气?

我已经能够通过一个按钮来解决这个问题,该按钮可以在按下按钮时获取新的位置和天气条件,但这不是很直观。我想知道如何才能在应用程序启动时获得新的条件。可能涉及到调用Restart()?

这里是我的程序只活动:

package com.photonfighterlabs.dropweather; 

import android.Manifest; 
import android.app.Activity; 
import android.content.pm.PackageManager; 
import android.graphics.drawable.Drawable; 
import android.location.Address; 
import android.location.Geocoder; 
import android.location.Location; 
import android.os.Bundle; 
import android.support.v4.app.ActivityCompat; 
import android.support.v4.content.ContextCompat; 
import android.util.Log; 
import android.view.View; 
import android.widget.ImageView; 
import android.widget.TextView; 
import android.widget.Toast; 

import com.ftoslab.openweatherretrieverz.CurrentWeatherInfo; 
import com.ftoslab.openweatherretrieverz.OpenWeatherRetrieverZ; 
import com.ftoslab.openweatherretrieverz.WeatherCallback; 
import com.ftoslab.openweatherretrieverz.WeatherUnitConverter; 
import com.google.android.gms.location.FusedLocationProviderClient; 
import com.google.android.gms.location.LocationServices; 
import com.google.android.gms.tasks.OnSuccessListener; 

import java.io.IOException; 
import java.util.List; 
import java.util.Locale; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 


public class WeatherActivity extends Activity { 

    private double lat; 
    private double lng; 

    private String temp; 
    private String icon; 

    private TextView tempTextView; 
    private TextView cityTextView; 
    private TextView conditionsTextView; 

    private int LOCATION_PERMISSION_ID = 1001; 

    CurrentWeatherInfo currentWeatherInfoF; 

    private String city; 
    private List<Address> addresses; 

    private FusedLocationProviderClient mFusedLocationClient; 

    OpenWeatherRetrieverZ retriever; 

    ImageView image; 

    Geocoder geocoder; 

    @Override 
    public void onCreate(Bundle bundle) { 
     super.onCreate(bundle); 
     setContentView(R.layout.activity_weather); 

     retriever = new OpenWeatherRetrieverZ(API_KEY); // hidden for obvious reasons, but working 


     mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this); 
     geocoder = new Geocoder(this, Locale.getDefault()); 

     tempTextView = (TextView) findViewById(R.id.temp_text_view); 
     cityTextView = (TextView) findViewById(R.id.city_text_view); 
     conditionsTextView = (TextView) findViewById(R.id.conditions_text_view); 

     image = (ImageView) findViewById(R.id.conditions_image); 






     if (ContextCompat.checkSelfPermission(WeatherActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { 
      ActivityCompat.requestPermissions(WeatherActivity.this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, LOCATION_PERMISSION_ID); 
      return; 
     } 

     mFusedLocationClient.getLastLocation() 
       .addOnSuccessListener(this, new OnSuccessListener<Location>() { 
        @Override 
        public void onSuccess(Location location) { 
         if (location != null) 
          lat = location.getLatitude(); 
         lng = location.getLongitude(); 

         try { 
          addresses = geocoder.getFromLocation(lat, lng, 1); 

         } catch (IOException e) { 
          e.printStackTrace(); 
         } 

         if (!addresses.isEmpty()) { 
          city = addresses.get(0).getLocality(); 
          cityTextView.setText("Current Weather - " + city); 
          Log.d("City", city); 
         } 

         Log.d("LAT", String.valueOf(lat)); 
         Log.d("LNG", String.valueOf(lng)); 
        } 
       }); 

     retriever.updateCurrentWeatherInfo(lat, lng, new WeatherCallback() { 
      @Override 
      public void onReceiveWeatherInfo(CurrentWeatherInfo currentWeatherInfo) { 
       currentWeatherInfoF = WeatherUnitConverter.convertToImperial(currentWeatherInfo); 

      } 

      @Override 
      public void onFailure(String error) { 
       Toast.makeText(WeatherActivity.this, error, Toast.LENGTH_SHORT).show(); 
      } 
     }); 

    } 

    public void onRetrieveButtonClick(View view) { 

     mFusedLocationClient.getLastLocation() 
       .addOnSuccessListener(this, new OnSuccessListener<Location>() { 
        @Override 
        public void onSuccess(Location location) { 
         if (location != null) 
          lat = location.getLatitude(); 
         lng = location.getLongitude(); 

         try { 
          addresses = geocoder.getFromLocation(lat, lng, 1); 

         } catch (IOException e) { 
          e.printStackTrace(); 
         } 

         if (!addresses.isEmpty()) { 
          city = addresses.get(0).getLocality(); 
          cityTextView.setText("Current Weather - " + city); 
          Log.d("City", city); 
         } 

         Log.d("LAT", String.valueOf(lat)); 
         Log.d("LNG", String.valueOf(lng)); 
        } 
       }); 


     retriever.updateCurrentWeatherInfo(lat, lng, new WeatherCallback() { 
      @Override 
      public void onReceiveWeatherInfo(CurrentWeatherInfo currentWeatherInfo) { 
       currentWeatherInfoF = WeatherUnitConverter.convertToImperial(currentWeatherInfo); 

      } 

      @Override 
      public void onFailure(String error) { 
       Toast.makeText(WeatherActivity.this, error, Toast.LENGTH_SHORT).show(); 
      } 
     }); 

     temp = currentWeatherInfoF.getCurrentTemperature(); 

     Log.d("TMP : ", String.valueOf(temp)); 

     tempTextView.setText(String.valueOf((int) Double.parseDouble(temp)) + (char) 0x00B0); 
     conditionsTextView.setText(currentWeatherInfoF.getWeatherDescriptionLong()); 


     String iconURL = currentWeatherInfoF.getWeatherIconLink().toString(); 

     Pattern p = Pattern.compile("\\d\\w(n|d)"); 
     Matcher m = p.matcher(iconURL); 


     if (m.find()) { 
      icon = m.group(); 
      Log.d("ICON", icon); 
      String iconName = "r" + icon; 
      image.setImageResource(getResources().getIdentifier(iconName, "drawable", getPackageName())); 
      Log.d("NAME", iconName); 
     } 

    } 




} 
+0

在恢复方法中每10秒调用一次方法 –

+0

为位置选择创建分离活动 – Anil

+0

为更新您的数据创建一个服务。 –

回答

1

getLastLocation()updateCurrentWeatherInfo(...)都是异步操作。你同时启动它们,这意味着updateCurrentWeatherInfo很可能在该位置可用之前运行。

您必须在获得该职位后才能启动该职位,例如从onSuccess听众处获得该职位。

0

您尝试过使用onResume()方法吗?

你可以用它当视图可见无线

0

Awareness在设备位置获得通过getWeather() API方法天气不管理位置访问或从服务器查询天气的API集成提供了一个snapshot-API导通需求。

示例代码片段:

Awareness.SnapshotApi.getWeather(mGoogleApiClient) 
    .setResultCallback(new ResultCallback<WeatherResult>() { 
    @Override 
    public void onResult(@NonNull WeatherResult weatherResult) { 
     if (!weatherResult.getStatus().isSuccess()) { 
     Log.e(TAG, "Could not get weather."); 
     return; 
     } 
     Weather weather = weatherResult.getWeather(); 
     Log.i(TAG, "Weather: " + weather); 
    } 
    }); 

请参阅here的天气类,它的实例是通过API返回的描述。

使用此功能的优点是,您可以大量简化代码,避免需要管理位置请求并根据需要经常调用API(我相信它具有缓存以避免太多的网络请求导致电池耗尽) 。