My MainActivity कॉल getLoc(MainActivity.this) ताकि यह मेरी दूसरी गतिविधि के संदर्भ को पास करे जिसे CurrentLocation कहा जाता है। CurrentLocation गतिविधि में, getLoc(Context context1) वैश्विक संदर्भ सेट करता है जिसका उपयोग onLocationChanged(Location location) द्वारा JsonTaskWeather() को कॉल करने के लिए भी किया जाता है, लेकिन ऐसा लगता है कि संदर्भ हमेशा शून्य होता है।

package com.tramtime.owner.croydontramtime;

import android.Manifest;
import android.annotation.TargetApi;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Build;
import android.os.Bundle;
import android.os.Looper;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.util.Log;
import android.widget.TextView;

import com.tramtime.owner.croydontramtime.Controllers.JsonTask.JsonTaskWeather;
import com.tramtime.owner.croydontramtime.Views.MainActivity;

public class CurrentLocation extends Activity implements LocationListener {
    private LocationManager myManager;
    private CurrentLocation loc;
    private double latitude;
    private double longitude;
    private Context context;

@Override
public void onLocationChanged(Location location) {
    String src = "lat="+location.getLatitude()+"&lon="+location.getLongitude();

    JsonTaskWeather jsonTaskWeather = new JsonTaskWeather(context);
    jsonTaskWeather.execute(
            "http://api.openweathermap.org/data/2.5/weather?"+src+"&appid=e58a3347bfbb6123ea384743a3f2e686");

}

public String see(){
    String foo = "lat and lon"+latitude+" "+longitude;
    return foo;
}

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

}

@Override
public void onProviderEnabled(String provider) {

}

@Override
public void onProviderDisabled(String provider) {

}

@TargetApi(Build.VERSION_CODES.M)
public void getLoc(Context context1) {
    this.context = context1;
    loc = new CurrentLocation();
    myManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
    if (ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED
            && ActivityCompat.checkSelfPermission(context, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        requestPermissions(new String[]{
                Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.ACCESS_COARSE_LOCATION,
                Manifest.permission.INTERNET
        }, 10);
        return;
    }else{
        myManager.requestSingleUpdate(LocationManager.GPS_PROVIDER, loc, Looper.myLooper());
    }

}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    switch (requestCode){
        case 10:
            if (grantResults.length>0 && grantResults[0] == PackageManager.PERMISSION_GRANTED);
    }
}

}

यह वही है जो लॉग आउट करता है:

08-28 08:26:11.607 8752-8752/com.tramtime.owner.croydontramtime E/AndroidRuntime: FATAL EXCEPTION: main
                                                                              Process: com.tramtime.owner.croydontramtime, PID: 8752
                                                                              java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.Context android.content.Context.getApplicationContext()' on a null object reference
                                                                                  at com.tramtime.owner.croydontramtime.CurrentLocation.onLocationChanged(CurrentLocation.java:36)
                                                                                  at android.location.LocationManager$ListenerTransport._handleMessage(LocationManager.java:288)
                                                                                  at android.location.LocationManager$ListenerTransport.access$000(LocationManager.java:217)
                                                                                  at android.location.LocationManager$ListenerTransport$2.handleMessage(LocationManager.java:240)
                                                                                  at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                                  at android.os.Looper.loop(Looper.java:152)
                                                                                  at android.app.ActivityThread.main(ActivityThread.java:5507)
                                                                                  at java.lang.reflect.Method.invoke(Native Method)
                                                                                  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                                                  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
08-28 08:26:11.704 8752-8752/com.tramtime.owner.croydontramtime I/Process: Sending signal. PID: 8752 SIG: 9
08-28 08:33:11.592 9367-9367/com.tramtime.owner.croydontramtime I/logging again: 0.0
08-28 08:33:11.624 9367-9447/com.tramtime.owner.croydontramtime I/DpmTcmClient: RegisterTcmMonitor from: com.android.okhttp.TcmIdleTimerMonitor
0
Daniel O Mensah 28 अगस्त 2016, 10:45
आपको ऐप स्तर context var आवश्यकता के लिए context गतिविधि का उपयोग नहीं करना चाहिए
 – 
Shaishav
28 अगस्त 2016, 10:47
आइए मुख्य गतिविधि को भी देखें
 – 
Zoe
28 अगस्त 2016, 10:49
चूंकि आप गतिविधि में हैं, इसलिए आपको संदर्भ का उपयोग करने की आवश्यकता नहीं है, बस इसका उपयोग करें या CurrentLocation.this
 – 
JAAD
28 अगस्त 2016, 10:51
फिर मुझे क्या उपयोग करना चाहिए ?? क्योंकि अन्यथा मैं मुख्य गतिविधि संदर्भ का संदर्भ कैसे दूं ??
 – 
Daniel O Mensah
28 अगस्त 2016, 10:55
लेकिन मैं मुख्य गतिविधि का संदर्भ देना चाहता हूं वर्तमान स्थान नहीं
 – 
Daniel O Mensah
28 अगस्त 2016, 10:56

1 उत्तर

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

समस्या यह है कि यह एक दोषपूर्ण डिजाइन है। सबसे पहले, मैं यह समझने में सक्षम नहीं हूं कि यदि आप स्थिर नहीं हैं तो आप getLoc फ़ंक्शन को कैसे कॉल कर सकते हैं? क्या MainActivity CurrentLocation वर्ग का विस्तार कर रही है?

वैसे भी यहाँ एक सुझाव है कि इसे कैसे काम किया जाए

1) सीधे MainActivity में LocationListener को लागू करें

2) करेंटलोकेशन क्लास को कॉल करने के इरादे का उपयोग करें और ऑनक्रिएट ऑफ करेंट लोकेशन के अंदर निम्नलिखित करके सामग्री को अपडेट करें

Content context;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    context = this;
    ....
}

अब संदर्भ ठीक से शुरू हो गया है और आप इसे कक्षा में कहीं भी उपयोग कर सकते हैं।

1
Gaurav Sarma 28 अगस्त 2016, 11:31