繁体   English   中英

从其他类更改 MainActivity 变量

[英]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到年底onReceiveResultAddressResultReceiver ,后您接收并存储这两个变量需要

目前,您正在Activity生命周期的最开始启动ParseXmlCuaca Service ,然后您的Activity获取位置并在AddressResultReceiver获取数据。 这就是为什么两个值都是null ,它们还没有启动(还)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM