2017-10-30 7 views
-3

私はJava言語を使い慣れていないし、ちょっと立ち往生しています。私はString Bobに場所を渡そうとしています。私はonLocationChangedメソッドからをメソッド外のString urlに渡す必要があります。 global variableを作成しましたが、String bobにはデータがありません。メソッド外の文字列に情報を渡すには?

ご協力いただければ幸いです。

public class MainActivity extends AppCompatActivity { 


String bob = ""; 

LocationManager locationManager; 
LocationListener locationListener; 

@Override 
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
    super.onRequestPermissionsResult(requestCode, permissions, grantResults); 

    if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { 
     if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) { 
      locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);} 
    } 
} 

TextView tempTextView; 
TextView dateTextView; 
TextView weatherDescTextView; 
TextView cityTextView; 
ImageView weatherImageView; 

@RequiresApi(api = Build.VERSION_CODES.N) 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    tempTextView = (TextView) findViewById(R.id.tempTextView); 
    dateTextView = (TextView) findViewById(R.id.dateTextView); 
    weatherDescTextView = (TextView) findViewById(R.id.weatherDescTextView); 
    cityTextView = (TextView) findViewById(R.id.cityTextView); 

    weatherImageView = (ImageView) findViewById(R.id.weatherImageView); 
    dateTextView.setText(getCurrentDate()); 

    // location 

    locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE); 
    locationListener = new LocationListener() { 
     @Override 
     public void onLocationChanged(Location location) { 

      // Log.i("Location", location.toString()); 
      Geocoder geocoder = new Geocoder(getApplicationContext(), Locale.getDefault()); 

      try { 
       List<Address> listAddresses = geocoder.getFromLocation(location.getLatitude(), location.getLongitude(), 1); 

       if (listAddresses != null && listAddresses.size() > 0) { 

        //Log.i("PlaceInfo", listAddresses.get(0).toString()); 

        if (listAddresses.get(0).getLocality() != null) 
        { 
         bob += listAddresses.get(0).getLocality() + " "; 
        } 


        Log.i("hello", bob.toString()); 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 


     } 

     @Override 
     public void onStatusChanged(String provider, int status, Bundle extras) { 
     } 
     @Override 
     public void onProviderEnabled(String provider) { 

     } 
     @Override 
     public void onProviderDisabled(String provider) { 
     } 
    }; 


    String url = "http://api.openweathermap.org/data/2.5/weather?q=" +bob+ "&units=metric&appid=xxxx"; 

答えて

0

onLocationChangedあなたがString urlを計算後を評価されます。

マルチスレッドについて理解したら、これを理解できます。

String urlonCreateの先頭に移動すると、現時点ではコードは変わりません。

あなたはURLが適切に割り当てられるようにしたい場合は、Log.i("hello"後にそれを移動し、さらには、それが個人的に正しい

だことを確認するためにログをチェックし、私は、Javaを学び、そこからプラットフォームとしてのAndroidを示唆していない

0

私は今、あなたへのアドバイスの私の最高の作品は、停止のAndroidを置く、およびJavaを学びに行く(または地獄を、Kotlinを始める)することである

Java言語に新たなんだ前に、 Androidをwとして学習しようとするあなたが行くようにell。 Androidは、言語を学ぶことなく、複雑なほど複雑です。

とにかく、あなたの実際の問題へと:私は文字列「ボブ」に場所を渡すためにしようとしている

。私はonLocationChangedメソッドの文字列を、メソッドの外側にあるStringのURLに渡す必要があります。私は 'グローバル'変数を作成しましたが、String 'bob'はデータを保持しません。

あなたは問題だというonLocationChanged方法は、実際にずっと後にあなたはURL変数を設定しようとしている時点よりも(あなたが実際にレジスタを仮定するまで呼び出されませんコールバックであるということですあなたのコードには表示されないコールバック)。

つまり、「場所を知っているときは教えてください」というシステムにフックインしている間、コードは続行されます。システムが場所を知っているとき(コールバックが呼び出されたとき)、新しい値を使用するのはあなたの責任です(あなたの場合は、ネットワーク要求を行うと仮定します)。

bobを更新する行の直後にロジックを移動します。

希望に役立ちます。

関連する問題