मुझे दो भंडारों के बीच दो चर साझा करने की आवश्यकता है। मैंने पहले से ही कई अलग-अलग समाधानों की कोशिश की है, लेकिन कोई भी काम नहीं किया। संक्षेप में: पहले भंडार में उपयोगकर्ता अंतिम ज्ञात स्थान (भौगोलिक अक्षांश और देशांतर) होता है, दूसरा भंडार एपीआई को निर्दिष्ट अंतराल के साथ बुलाता है, जैसे भौगोलिक अक्षांश और देशांतर। बात यह है कि मैं लगातार उन मानों को 0,0 के बराबर प्राप्त कर रहा हूं। क्या आप मुझे कुछ संकेत दे सकते हैं कि मुझे यह कैसे करना चाहिए? एक बात जो मैंने देखी है, वह यह है कि पूरा कार्यक्रम तुरंत चलता है, जबकि स्थान भंडार को अक्षांश और देशांतर प्राप्त करने के लिए कुछ सेकंड की आवश्यकता होती है। तो कार्यक्रम लगातार एपीआई को 0,0 के बराबर एंडपॉइंट्स के साथ बुला रहा है जैसा कि मैंने ऊपर बताया था।

स्थान संग्रह

    public class LocationRepository {

    private double mLatitude, mLongitude;
    
    public void test(Application application) {
        FusedLocationProviderClient client = LocationServices.getFusedLocationProviderClient(application.getApplicationContext());
        {
            if (ContextCompat.checkSelfPermission(
                    application.getApplicationContext(), Manifest.permission.INTERNET) == PackageManager.PERMISSION_GRANTED &&
                    ContextCompat.checkSelfPermission(application.getApplicationContext(), Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED &&
                    ContextCompat.checkSelfPermission(application.getApplicationContext(), Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) {

                client.getLastLocation().addOnSuccessListener(new OnSuccessListener<Location>() {
                    @Override
                    public void onSuccess(Location location) {
                        mLongitude = location.getLongitude();
                        mLatitude = location.getLatitude();
                    }
                });
            }
        }
    }
}

पूर्वानुमान संग्रह

public MutableLiveData<ForecastModel> testCall() {
MutableLiveData<ForecastModel> data = new MutableLiveData<>();

mApi.test(mLatitude, mLongitude, "metric", API_KEY).enqueue(new Callback<ForecastModel>() {
    @Override
    public void onResponse(Call<ForecastModel> call, Response<ForecastModel> response) {
        if (!response.isSuccessful()) {
            Log.i(TAG, "onResponse: " + response.code());
        }
        data.setValue(response.body());
    }
    @Override
    public void onFailure(Call<ForecastModel> call, Throwable t) {
        Log.i(TAG, "onFailure: " + t.getMessage());
    }
});
return data;
}

व्यूमॉडल

private ForecastRepository mForecastRepository;
private LocationRepository mLocationRepository;

private MutableLiveData<ForecastModel> mForecastData;

public ForecastViewModel(@NonNull Application application) {
    super(application);
    mLocationRepository = new LocationRepository();
    mLocationRepository.test(application);

    mForecastRepository = new ForecastRepository();
    mForecastData = mForecastRepository.testCall();
}
1
BackToDream 5 जिंदा 2021, 16:20
ForecaseRepository LocationRepository के mLatitude और mLongitude वैरिएबल को कैसे एक्सेस करता है?
 – 
Tayyab Mazhar
5 जिंदा 2021, 16:28
अभी के लिए ऐसा नहीं है। मैंने वह सब कुछ हटा दिया है जिसे मैंने कोड को साफ करने का प्रयास किया था। मैंने पहले से ही चर को स्थिर बनाने की कोशिश की है, उन चरों को विधियों के माध्यम से, यहां तक ​​​​कि सूचियों के रूप में भी भेज रहा हूं।
 – 
BackToDream
5 जिंदा 2021, 16:31
आपको लाइवडाटा/स्टेटफ्लो का उपयोग करने और पूर्वानुमान रेपो के अंदर इसका निरीक्षण करने की आवश्यकता है।
 – 
Tayyab Mazhar
5 जिंदा 2021, 17:09
मुझे लगा कि आप रिपॉजिटरी में लाइवडेटा नहीं देख सकते।
 – 
BackToDream
5 जिंदा 2021, 18:20
आप जहां चाहें इसका अवलोकन कर सकते हैं। बस अपने कोड को ठीक से आर्किटेक्ट करने का प्रयास करें।
 – 
Tayyab Mazhar
5 जिंदा 2021, 20:56

1 उत्तर

सबसे बढ़िया उत्तर

परिवर्तनों को ट्रैक करने के लिए आप ViewModel और Transformation.switchMap() में दो लिवडाटा का उपयोग कर सकते हैं। हर बार mLocationData परिवर्तन mForcastData भी अपडेट होगा। यदि आप नहीं जानते कि स्विचमैप कैसे काम करता है तो आप इसे देख सकते हैं कैसे और कहां उपयोग करें Transformations.switchMap?

इस तरह अपना व्यूमोडेल और लोकेशन रिपोजिटरी बदलें।

व्यूमॉडल

public class ForecastViewModel extends AndroidViewModel {

    private ForcastRepository mForecastRepository;
    private LocationRepostiory mLocationRepository;

    private LiveData<ForecastModel> mForecastData;
    private LiveData<LocationModel> mLocationData;

    public ForecastViewModel(@NonNull Application application) {
        super(application);
        mLocationRepository = new LocationRepostiory();
        mLocationRepository.test(application);
        mLocationData = mLocationRepository.getMutableLiveData();
        mForecastRepository = new ForcastRepository();

        mForecastData = Transformations.switchMap(mLocationData, location->
                mForecastRepository.testCall(location.getLatitude(), location.getLongitude()));
    }

    public LiveData<ForecastModel> getmForecastData() {
        return mForecastData;
    }
}

स्थान रिपोजिटरी

class LocationRepostiory {

private LocationModel mLocation;
private MutableLiveData<LocationModel> mutableLiveData = new MutableLiveData();

public void test(Application application) {
    FusedLocationProviderClient client = LocationServices.getFusedLocationProviderClient(application.getApplicationContext());
    {
        if (ContextCompat.checkSelfPermission(
                application.getApplicationContext(), Manifest.permission.INTERNET) == PackageManager.PERMISSION_GRANTED &&
                ContextCompat.checkSelfPermission(application.getApplicationContext(), Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED &&
                ContextCompat.checkSelfPermission(application.getApplicationContext(), Manifest.permission.ACCESS_COARSE_LOCATION) == PackageManager.PERMISSION_GRANTED) {

            client.getLastLocation().addOnSuccessListener(location -> {
                mLocation = new LocationModel(location.getLongitude(),location.getLatitude());
                mutableLiveData.setValue(mLocation);
            });
        }
    }
}

public MutableLiveData<LocationModel> getMutableLiveData() {
    return mutableLiveData;
}
}

फॉरकास्ट रिपोजिटरी

public MutableLiveData<ForecastModel> testCall(double mLatitude, double mLongitude ) {
MutableLiveData<ForecastModel> data = new MutableLiveData<>();

mApi.test(mLatitude, mLongitude, "metric", API_KEY).enqueue(new Callback<ForecastModel>() {
    @Override
    public void onResponse(Call<ForecastModel> call, Response<ForecastModel> response) {
        if (!response.isSuccessful()) {
            Log.i(TAG, "onResponse: " + response.code());
        }
        data.setValue(response.body());
    }
    @Override
    public void onFailure(Call<ForecastModel> call, Throwable t) {
        Log.i(TAG, "onFailure: " + t.getMessage());
    }
});
return data;
}

स्थान मॉडल

class LocationModel {
    private Double longitude, latitude;

    public LocationModel(Double longitude, Double latitude) {
        this.longitude = longitude;
        this.latitude = latitude;
    }

    public Double getLongitude() {
        return longitude;
    }

    public Double getLatitude() {
        return latitude;
    }
}

यदि आप एक अतिरिक्त स्थान मॉडल वर्ग नहीं बनाना चाहते हैं तो आप अपना स्थान डेटा सूची या ऐरेलिस्ट के रूप में भी भेज सकते हैं। बस मैं इसे पसंद करता हूं।

संपादित: कुछ गलतियाँ थीं जिन्हें मैंने सुधारा है। अब कोड काम कर रहा है। टेस्टकॉल से लॉगकैट () ForcastRepository D/TAG में विधि: टेस्टकॉल: 90.3993212,23.7793183

1
Rafiul 6 जिंदा 2021, 00:17
यह काम नहीं करेगा। स्थान रिपोजिटरी स्थान वस्तु लौटाएगा जो उस बिंदु पर शून्य होगा। एमलोकेशन का मान शून्य रहेगा - स्थान प्राप्त होने पर यह अपडेट नहीं होगा।
 – 
Tayyab Mazhar
5 जिंदा 2021, 20:55
स्थान रिक्त नहीं था लेकिन कोड में कुछ त्रुटियां थीं। अब मैंने संपादित किया है। कृपया दोबारा जांच करें।
 – 
Rafiul
5 जिंदा 2021, 23:30
अभी के लिए सब कुछ ठीक काम करता है। स्विचमैप मेरे लिए काफी नया विषय है। मदद के लिए धन्यवाद, इसकी बहुत सराहना करते हैं।
 – 
BackToDream
6 जिंदा 2021, 15:01