2015-05-22 4 views
0

Я учащийся в android. Я пытаюсь получить погоду в текущем местоположении. В моем приложении есть кнопка «Обновить», чтобы обновить пользовательский интерфейс с последними данными о погоде. Когда приложение загружается, оно показывает погоду 0.0, 0.0 широты и долготы. Когда я нажимаю кнопку «Обновить», она показывает погоду моего текущего местоположения. Как я могу получить погоду моего текущего местоположения, когда приложение загружается? Я использовал Google Play Services для получения текущего местоположения. Ниже мой код.получить текущее местоположение с runOnUiThread

MainActivity.java

public class MainActivity extends ActionBarActivity implements GoogleApiClient.ConnectionCallbacks, 
     GoogleApiClient.OnConnectionFailedListener { 

    public String apiKey; 
    public double latitude; 
    public double longitude; 
    public String forecastUrl; 
    public static final String TAG = MainActivity.class.getSimpleName(); 
    private GoogleApiClient mGoogleApiClient; 
    protected Location mLastLocation; 

    public MainActivity() { 
     apiKey = “XXXXXXXXXX"; 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     buildGoogleApiClient(); 
     mRefreshImageView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       getForecast(); 
      } 
     }); 
     getForecast(); 
    } 

    protected synchronized void buildGoogleApiClient() { 
     mGoogleApiClient = new GoogleApiClient.Builder(this) 
       .addConnectionCallbacks(this) 
       .addOnConnectionFailedListener(this) 
       .addApi(LocationServices.API) 
       .build(); 
    } 

    protected void onStart() { 
     super.onStart(); 
     mGoogleApiClient.connect(); 
    } 

    protected void onResume() { 
     super.onResume(); 
     mGoogleApiClient.connect(); 
    } 

    protected void onStop() { 
     super.onStop(); 
     if (mGoogleApiClient.isConnected()) { 
      mGoogleApiClient.disconnect(); 
     } 
    } 

    private void getForecast() { 
     if (isNetworkAvailable()) { 
      forecastUrl = “http://www.forecastUrlGoesHere.com/" + apiKey + “/“ + latitude + "," + longitude; 
      toggleRefresh(); 

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

       @Override 
       public void onResponse(Response response) throws IOException { 
        runOnUiThread(new Runnable() { 
         @Override 
         public void run() { 
          toggleRefresh(); 
         } 
        }); 
        try { 
         String jsonData = response.body().string(); 
         if (response.isSuccessful()) { 
          runOnUiThread(new Runnable() { 
           @Override 
           public void run() { 
            updateView(); //updates the screen ui 
           } 
          }); 
         } else { 
          alertUserAboutError(); 
         } 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } catch (JSONException e) { 

        } 
       } 
      }); 
     } else { 
      Toast.makeText(this, getString(R.string.network_error_message), Toast.LENGTH_LONG).show(); 
     } 
    } 

    private void updateView() { 
    //code to update ui 
    } 

    private boolean isNetworkAvailable() { 
    //check network availability 
    } 

    private void alertUserAboutError() { 
     AlertDialogFragment dialog = new AlertDialogFragment(); 
     dialog.show(getFragmentManager(), "error_dialog"); 
    } 

    private void toggleRefresh() { 
    } 

    @Override 
    public void onConnected(Bundle bundle) { 
     mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); 
     if (mLastLocation != null) { 
      latitude = mLastLocation.getLatitude(); 
      longitude = mLastLocation.getLongitude(); 
      Toast.makeText(this, latitude + " " + longitude, Toast.LENGTH_LONG).show(); 
     } else { 
      Toast.makeText(this, getString(R.string.no_location_detected), Toast.LENGTH_LONG).show(); 
     } 
    } 

    @Override 
    public void onConnectionSuspended(int i) { 
     Log.i(TAG, "Connection suspended"); 
     mGoogleApiClient.connect(); 
    } 

    @Override 
    public void onConnectionFailed(ConnectionResult connectionResult) { 
     if (connectionResult.hasResolution()) { 
      try { 
       connectionResult.startResolutionForResult(this, 9000); 
      } catch (IntentSender.SendIntentException e) { 
       e.printStackTrace(); 
      } 
     } else { 
      Log.i(TAG, "Connection failed, ERROR: " + connectionResult.getErrorCode()); 
     } 
    } 
} 

ответ

1

Ну Есть несколько способов, чтобы получить ожидаемый результат. Позвольте мне написать шаги для одного из них:

а) Используйте ProgressDialog и запустить его в OnCreate

б) Перемещение getForecast() из OnCreate

с) В методе onConnected после того, как lat и long, проверьте, все ли видимы ProgressDialog. Если да, закройте это окно и вызвать getForecast

ProgressDialog ссылка http://developer.android.com/reference/android/app/ProgressDialog.html

1

В вашем onConnected обратного вызова, вызов getForecast();:

@Override 
public void onConnected(Bundle bundle) { 
    mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); 
    if (mLastLocation != null) { 
     latitude = mLastLocation.getLatitude(); 
     longitude = mLastLocation.getLongitude(); 
     Toast.makeText(this, latitude + " " + longitude, Toast.LENGTH_LONG).show(); 
    } else { 
     Toast.makeText(this, getString(R.string.no_location_detected), Toast.LENGTH_LONG).show(); 
    } 

    getForecast(); 
}