[英]Change MainActivity Variable from Other Class
对不起,请帮忙。 我有 MainActivity 和 2 个 IntentService。 我想从 FetchAddressIntentService 获取的变量更改我的 MainActivity 变量(kabupaten 和 provinsi)。 然后,我想将该变量(kabupaten 和 provinsi)赋予另一个意图(ParseXmlCuaca)。问题是 kabupaten 和 provinsi 变量为空,尽管 FetchAddressIntentService 已经运行。 如何解决这个问题呢? 对不起,我的英语不好..感谢您的帮助....
主要活动代码
package com.example.gawaipintarcuaca;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.fragment.app.Fragment;
import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.location.Geocoder;
import android.location.Location;
import android.os.Bundle;
import android.os.Handler;
import android.os.ResultReceiver;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import com.google.android.gms.location.FusedLocationProviderClient;
import com.google.android.gms.location.LocationCallback;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.android.material.bottomnavigation.BottomNavigationView;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import java.util.concurrent.TimeUnit;
public class MainActivity extends AppCompatActivity {
private TextView lokasi;
private TextView waktu;
private FusedLocationProviderClient fusedLocationProviderClient;
protected Location lastLocation;
private AddressResultReceiver resultReceiver;
private LocationCallback locationCallback;
private TextView suhu;
public static String kabupaten;
public static String provinsi;
private String kodeCuaca;
private Date date;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
resultReceiver = new AddressResultReceiver(new Handler());
lokasi = findViewById(R.id.kota);
date = Calendar.getInstance().getTime();
waktu = findViewById(R.id.waktu);
waktu.setText(date.toString());
//Ambil Lokasi
fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this);
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
!= PackageManager.PERMISSION_GRANTED
&& ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)
!= PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{
Manifest.permission.ACCESS_FINE_LOCATION}, 2);
}
fusedLocationProviderClient.getLastLocation()
.addOnSuccessListener(this, new OnSuccessListener<Location>() {
@Override
public void onSuccess(Location location) {
if (location != null) {
lastLocation = location;
startIntentService();
}
}
});
startIntentService1();
suhu = findViewById(R.id.suhu);
}
protected void startIntentService(){
Intent intent = new Intent (this, FetchAddressIntentService.class);
intent.putExtra(Constants.RECEIVER, resultReceiver);
intent.putExtra(Constants.LOCATION_DATA_EXTRA, lastLocation);
startService(intent);
}
private void startIntentService1() {
Intent intent = new Intent(this, ParseXmlCuaca.class);
Bundle bundle = new Bundle();
bundle.putString("kabupaten", kabupaten);
bundle.putString("provinsi", provinsi);
intent.putExtra("Bundle", bundle);
startService(intent);
}
private class AddressResultReceiver extends ResultReceiver{
public AddressResultReceiver(Handler handler) {
super(handler);
}
@Override
protected void onReceiveResult(int resultCode, Bundle resultData) {
if (resultData == null){
return;
}
String addressOutput = resultData.getString(Constants.RESULT_DATA_KEY);
kabupaten = resultData.getString("kabupaten");
String[] kab = kabupaten.split(" ");
MainActivity.kabupaten = "";
int kabLength = kab.length;
for (int i = 1; i < kabLength; i++ ){
if (i == kabLength - 1){
MainActivity.kabupaten += kab[i];
}
else{
MainActivity.kabupaten += kab[i] + " ";
}
}
MainActivity.provinsi = resultData.getString("provinsi");
showResult(addressOutput);
}
private void showResult(String addressOutput) {
lokasi.setText(addressOutput);
}
}
}
FetcAddressIntentService
package com.example.gawaipintarcuaca;
import android.app.IntentService;
import android.content.Intent;
import android.location.Address;
import android.location.Geocoder;
import android.location.Location;
import android.nfc.Tag;
import android.os.Bundle;
import android.os.ResultReceiver;
import android.text.TextUtils;
import android.util.Log;
import androidx.annotation.Nullable;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
public class FetchAddressIntentService extends IntentService {
public static final String TAG = "Service Lokasi";
protected ResultReceiver receiver;
public String provinsi;
public String kabupaten;
public FetchAddressIntentService() {
super(TAG);
}
@Override
protected void onHandleIntent(@Nullable Intent intent) {
Geocoder geocoder = new Geocoder(this, Locale.getDefault());
if (intent == null) {
return;
}
String errorMessage = " ";
Location location = intent.getParcelableExtra(Constants.LOCATION_DATA_EXTRA);
receiver = intent.getParcelableExtra(Constants.RECEIVER);
List <Address> addresses = null;
try{
addresses = geocoder.getFromLocation(
location.getLatitude(),
location.getLongitude(),
1);
}
catch (IOException ioException){
errorMessage = getString(R.string.service_not_available);
Log.e(TAG, errorMessage, ioException);
}
catch (IllegalArgumentException illegalArgumentException){
errorMessage = getString(R.string.invalid_lat_long_used);
Log.e(TAG, errorMessage + ". " + "Latitude = "
+ location.getLatitude() + ", Longitude = " +
location.getLongitude(), illegalArgumentException);
}
if (addresses == null || addresses.size() == 0){
if (errorMessage.isEmpty()){
errorMessage = getString(R.string.no_address_found);
Log.e(TAG, errorMessage);
}
deliverResultToReceiver(Constants.FAILURE_RESULT, errorMessage);
}
else{
Address address = addresses.get(0);
ArrayList <String> addressFragments = new ArrayList<String>();
for (int i = 0 ; i <= address.getMaxAddressLineIndex(); i++){
addressFragments.add(address.getAddressLine(i));
}
Log.i(TAG, getString(R.string.address_found));
kabupaten = address.getSubAdminArea();
provinsi = address.getAdminArea();
deliverResultToReceiver(Constants.SUCCESS_RESULT, TextUtils.join(System.getProperty("line.seperator"),addressFragments));
}
}
private void deliverResultToReceiver(int resultCode, String message) {
Bundle bundle = new Bundle();
bundle.putString(Constants.RESULT_DATA_KEY, message);
bundle.putString("kabupaten", kabupaten);
bundle.putString("provinsi", provinsi);
receiver.send(resultCode, bundle);
}
}
移动startIntentService1();
从年底onCreate
到年底onReceiveResult
在AddressResultReceiver
,后您接收并存储这两个变量需要
目前,您正在Activity
生命周期的最开始启动ParseXmlCuaca
Service
,然后您的Activity
获取位置并在AddressResultReceiver
获取数据。 这就是为什么两个值都是null
,它们还没有启动(还)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.