मैं गैर-गतिविधि वर्ग (स्थान प्रबंधक) में getSystemService का उपयोग कैसे कर सकता हूं?


181

मुझे भारी लिफ्टिंग करने के लिए मुख्य गतिविधियाँ OnCreate मेथड से दूसरे क्लास में टास्क को ऑफ करने में परेशानी हो रही है।

जब मैं गैर-गतिविधि वर्ग से getSystemService को कॉल करने का प्रयास करता हूं तो एक अपवाद फेंक दिया जाता है।

किसी भी तरह की सहायता का स्वागत किया जाएगा :)

lmt.java:

package com.atClass.lmt;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
import android.location.Location;

public class lmt extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        fyl lfyl = new fyl();
        Location location = lfyl.getLocation();
        String latLongString = lfyl.updateWithNewLocation(location);

        TextView myLocationText = (TextView)findViewById(R.id.myLocationText);
        myLocationText.setText("Your current position is:\n" + latLongString);
    }
}

fyl.java

package com.atClass.lmt;

import android.app.Activity;
import android.os.Bundle;
import android.location.Location;
import android.location.LocationManager;
import android.os.Bundle;
import android.widget.TextView;
import android.content.Context;

public class fyl {
    public Location getLocation(){
        LocationManager locationManager;
        String context = Context.LOCATION_SERVICE;
        locationManager = (LocationManager)getSystemService(context);

        String provider = LocationManager.GPS_PROVIDER;
        Location location = locationManager.getLastKnownLocation(provider);

        return location;
    }

    public String updateWithNewLocation(Location location) {
        String latLongString;

        if (location != null){
            double lat = location.getLatitude();
            double lng = location.getLongitude();
            latLongString = "Lat:" + lat + "\nLong:" + lng;
        }else{
            latLongString = "No Location";
        }

        return latLongString;
    }
}

2
प्रश्न के अपवाद और स्टैक ट्रेस को जोड़ने से संभावित उत्तरदाताओं को मदद मिल सकती है
बर्ट एफ

हाय, गलती के लिए क्षमा करें। यदि मैं इस एक के साथ गतिविधि वर्ग का विस्तार करने का प्रयास करता हूं तो अपवाद को फेंक दिया जाता है। मैं इस वर्ग के लिए गतिविधि वर्ग का विस्तार नहीं करना चाहता हूँ और बस अपने गेटलेकेशन विधि से getSystemService को कॉल करने में सक्षम होना चाहता हूँ। अपवाद: java.lang.IllegalStateException: सिस्टम सेवाएँ onCreate से पहले की गतिविधियों के लिए उपलब्ध नहीं हैं ()
केविन पार्कर

जवाबों:


280

आपको अपना संदर्भ अपने fyl class में देने की आवश्यकता है ..
एक समाधान आपकी fylकक्षा के लिए इस तरह का एक कंस्ट्रक्टर है :

public class fyl {
 Context mContext;
 public fyl(Context mContext) {
       this.mContext = mContext;
 }

 public Location getLocation() {
       --
       locationManager = (LocationManager)mContext.getSystemService(context);

       --
 }
}

इसलिए अपनी गतिविधि कक्षा में onCreateइस तरह से फील की वस्तु बनाएं :

package com.atClass.lmt;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
import android.location.Location;

public class lmt extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        fyl lfyl = new fyl(this); //Here the context is passing 

        Location location = lfyl.getLocation();
        String latLongString = lfyl.updateWithNewLocation(location);

        TextView myLocationText = (TextView)findViewById(R.id.myLocationText);
        myLocationText.setText("Your current position is:\n" + latLongString);
    }
}

क्षमा करें, मुझे यह नहीं मिला, कोड अधिक सहायक होगा। यदि कुछ भी हो, तो मुझे एक स्थान प्रबंधक को गेटलेलेशन विधि में पास करना चाहिए ... मैं वास्तव में यह नहीं देखता कि मुझे इस विधि को संदर्भ देने में कैसे मदद मिलेगी जब मैं इस कक्षा को गतिविधि के लिए एक विस्तारित वर्ग के रूप में लिखे बिना गेटसिस्टम सर्विस भी नहीं कह सकता।
केविन पार्कर

क्या आपने यह कोशिश की। OnCreate में यदि आप 'इस' के संदर्भ में अभिगमन कर रहे हैं
Labeeb Panampullan

लेकिन अगर lmtवर्ग अभ्यस्त हो जाता है, तो flyसंदर्भ नहीं होगा
हंट

BTW getSysytemService()केवल Stringएक पैरामीटर के रूप में स्वीकार करता है । इसलिए आप इसके लिए एक संदर्भ नहीं दे सकतेमैं इसके आसपास कैसे पहुंचू? @ हंट
पार्थ साने

2
बस उल्लेख करने के लिए, एंड्रॉयड प्रबंधकों ( BluetoothManager, ActivityManagerआदि) भी कर रहे हैं का निर्माण किया कि जिस तरह से (जरूरी नहीं एक गुजर Activityउनके निर्माता को संदर्भ) और यही कारण है कि वे आवेदन दायरे में घटकों का उपयोग कर सकते हैं।
Eido95 12

46

आप इसके लिए जा सकते हैं:

getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);

5
getActivity () विधि वर्ग के लिए अपरिभाषित है। यह त्रुटि दिखाई देती है।
डारपन

वह वर्ग प्रकार क्या है जिसमें आप इसका उपयोग कर रहे हैं? यानी यह एक रिसीवर वर्ग, टुकड़ा, सरल जावा वर्ग या कोई अन्य है।
मैडी

आपको एक गतिविधि के बजाय अपनी गतिविधि को फ़्रीएक्टएक्टिविटी के साथ विस्तारित करने की आवश्यकता है। मुझे आशा है कि यह आपके लिए काम करेगा ...?
मैडी

यह एक साधारण वर्ग के लिए काम नहीं करता है जहाँ मैं विस्तार करना चाहता हूँ ArrayAdapter
डेविड सिल्वा-बैरेरा

2
MIA ने getActivity () के बजाय getContext () का उपयोग करके काम किया!
अमीर

16

एक तरह से मैंने इसके चारों ओर एक उदाहरण दिया है, उदाहरणों के लिए एक स्थिर वर्ग बनाकर। मैंने AS3 में इसका बहुत उपयोग किया है मैंने Android विकास में भी मेरे लिए बहुत अच्छा काम किया है।

Config.java

public final class Config {
    public static MyApp context = null;
}

MyApp.java

public class MyApp extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Config.context = this;
    }
    ...
}

फिर आप संदर्भ का उपयोग करके या उपयोग कर सकते हैं Config.context

LocationManager locationManager;
String context = Context.LOCATION_SERVICE;
locationManager = Config.context.getSystemService(context);

4
मैं इस पद्धति के साथ जो समस्या देख रहा हूं वह यह है कि यह असुरक्षित रूप से कुछ छोड़ देता है, अगर कोई इसे करने के लिए अशक्त था, तो शायद एक भयावह विफलता उत्पन्न करेगा?
रोब

2
इस पर एक भिन्नता MyApp में एक निजी स्टेटिक लगाने के लिए है, और फिर गेटर्स जोड़ें। private static MyApp _context; public static MyApp getContext() { return _context; }... _context = this; onCreate: onStop में: _context = null;... उपयोग MyApp.getContext():।
टूलमेकरसेव

2
यह शायद स्मृति रिसाव की ओर ले जाता है
Yat3s

2
यह स्मृति रिसाव के लिए पूरी तरह से नेतृत्व करेगा। आदर्श रूप से आपको इस प्रक्रिया का उपयोग नहीं करना चाहिए।
शुरुआती

0

मुझे नहीं पता कि यह मदद करेगा, लेकिन मैंने ऐसा किया:

LocationManager locationManager  = (LocationManager) context.getSystemService(context.LOCATION_SERVICE);

सही तरीका स्थिर तरीके से उपयोग करना है, जैसा कि @ मैडी कहते हैं
russellhoff

0

कुछ गैर-गतिविधि वर्गों के लिए, श्रमिक की तरह , आपको पहले से ही सार्वजनिक निर्माण में एक संदर्भ वस्तु दी गई है।

Worker(Context context, WorkerParameters workerParams)

आप उदाहरण के लिए, उदाहरण के लिए, इसे एक निजी प्रसंग चर में सहेज सकते हैं, जैसे, mContextउदाहरण के लिए,

mContext.getSystenService(Context.ACTIVITY_SERVICE)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.