2017-07-14 2 views
1

Der Hauptteil dieser Frage ist, wenn ich diesen Code ausführe, werden die TextViews latitudeTextView und longitudeTextView korrekt aktualisiert, daher werden die globalen Variablen auf die richtigen Werte geändert. Aber wenn ich versuche, wieder auf sie zuzugreifen, nachdem ich eine asynctask gegangen bin, werden sie auf 0.0, 0.0 gesetzt? Sollten sie nicht nach dem Ende von onPostExecute dieselben Werte beibehalten?  Globale Variable, die nach Abschluss einer AsyncTask auf 0.0 zurückkehrt

public class MainActivity extends AppCompatActivity implements LoaderManager.LoaderCallbacks<Weather>{ 

    private static final String GOOGLE_CONVERTER = "https://maps.googleapis.com/maps/api/geocode/json"; 

    private static final String GOOGLE_KEY = "AIzaSyBtt8yaXoRvLTkJHUXrhl5pQaLxomReHIA"; 

    public static final int LOADER_ID = 0; 

    String jsonResponse = ""; 
    private String address; 

    private TextView latitudeTextView; 
    private TextView longitudeTextView; 
    private TextView summaryTextView; 
    private TextView tempuratureTextView; 
    private TextView timezoneTextView; 
    private TextView textTextView; 

    private double latitude = 0.0; 
    private double longitude = 0.0; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     latitudeTextView = (TextView) findViewById(R.id.latitude); 
     longitudeTextView = (TextView) findViewById(R.id.longitude); 
     summaryTextView = (TextView) findViewById(R.id.summaryTextView); 
     tempuratureTextView = (TextView) findViewById(R.id.temperatureTextView); 
     timezoneTextView = (TextView) findViewById(R.id.timezoneTextView); 
     textTextView = (TextView) findViewById(R.id.test); 

     final EditText addressEditText = (EditText) findViewById(R.id.edittext_address); 
     Button submitButton = (Button) findViewById(R.id.submit_button); 

     submitButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       address = addressEditText.getText().toString().trim(); 
       address = "5121+Paddock+Court+Antioch+Ca+94531"; 
       String fullUrl = GOOGLE_CONVERTER + "?address=" + address + "&key=" + GOOGLE_KEY; 
       new getlongAndLat().execute(fullUrl); 
       textTextView.setText(latitude + ""); 
       //Log.e("TAG", latitude + " " + longitude); 
       // getLoaderManager().initLoader(LOADER_ID, null, MainActivity.this); 
      } 
     }); 
    } 

    @Override 
    public android.content.Loader<Weather> onCreateLoader(int id, Bundle args) { 
     return new WeatherAsyncTaskLoader(this, latitude, longitude); 
    } 

    @Override 
    public void onLoadFinished(android.content.Loader<Weather> loader, Weather data) { 

    } 

    @Override 
    public void onLoaderReset(android.content.Loader<Weather> loader) { 

    } 


    public class getlongAndLat extends AsyncTask<String, String, String> { 

     @Override 
     protected String doInBackground(String... params) { 
      HttpURLConnection connection = null; 
      InputStream inputStream = null; 
      try { 
       URL url = new URL(params[0]); 
       connection = (HttpURLConnection) url.openConnection(); 
       connection.setRequestMethod("GET"); 
       connection.connect(); 
       Log.e("TAG", connection.getResponseCode() + ""); 

       if (connection.getResponseCode() == 200) { 
        inputStream = connection.getInputStream(); 
        jsonResponse = readFromStream(inputStream); 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } finally { 
       if (connection != null) { 
        connection.disconnect(); 
       } 
       if (inputStream != null) { 
        try { 
         inputStream.close(); 
        } catch (IOException e) { 
         //trouble closing input stream 
         e.printStackTrace(); 
        } 
       } 
      } 
      extractJsonResponse(jsonResponse); 
      return null; 
     } 

     @Override 
     protected void onPostExecute(String s) { 
      latitudeTextView.setText(latitude + ""); 
      longitudeTextView.setText(longitude + ""); 
      super.onPostExecute(s); 
     } 
    } 

    private void extractJsonResponse(String jsonResponse) { 
     try { 
      JSONObject rootJsonObject = new JSONObject(jsonResponse); 
      JSONArray nodeResultsArray = rootJsonObject.getJSONArray("results"); 
      JSONObject nodeFirstObject = nodeResultsArray.getJSONObject(0); 
      JSONObject nodeGeometryObject = nodeFirstObject.getJSONObject("geometry"); 
      JSONObject nodeLocation = nodeGeometryObject.getJSONObject("location"); 

      latitude = nodeLocation.getDouble("lat"); 
      longitude = nodeLocation.getDouble("lng"); 

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

    private String readFromStream(InputStream inputStream) throws IOException{ 
     StringBuilder output = new StringBuilder(); 
     if (inputStream != null) { 
      InputStreamReader inputStreamReader = new InputStreamReader(inputStream, Charset.forName("UTF-8")); 
      BufferedReader reader = new BufferedReader(inputStreamReader); 
      String line = reader.readLine(); 
      while (line != null) { 
       output.append(line); 
       line = reader.readLine(); 
      } 
     } 
     return output.toString(); 

    } 

} 
+0

Sprechen Sie über diese Zeile 'textTextView.setText (latitude +" ")'? und hier bekommst du den Breitengrad Null? –

+0

Es ist nicht klar, wo Ihr Problem ist, aber ein potenzielles Problem ist, dass Sie ein 'private double'-Feld in einem Thread und dann in einem anderen Thread ohne' volatile' oder 'synchronized' Schlüsselwort und keine andere dazwischenliegende Speicherbarriere. Was lässt Sie glauben, dass Sie einen aktuellen Wert aus diesem Feld lesen anstatt einen alten Wert aus einem Register oder einer Cache-Zeile? –

Antwort

0

In Ihrem Code doInBackground(), rufen Sie extractJsonResponse() -Methode vor return-Anweisung. In extractJsonResponse(), sind Sie immer lat und lange in seinem Code diejenigen auf globale Variablen Einstellung

JSONObject nodeLocation = nodeGeometryObject.getJSONObject("location"); 

    latitude = nodeLocation.getDouble("lat"); 
    longitude = nodeLocation.getDouble("lng"); 

Ich bin sicher, dass Sie diese Null-Werte von Json Objekt wie erwähnt bekommen. Sie müssen dieses Ding an Ihrem Ende überprüfen

Verwandte Themen