আমি কীভাবে একটি অ-অ্যাক্টিভিটি ক্লাসে (লোকেশনম্যানেজার) গেটসিসটেম সার্ভিস ব্যবহার করতে পারি?


180

ভারী উত্তোলন করতে আমি অন্য ক্রিয়াকলাপের মূল ক্রিয়াকলাপগুলি অনক্রিয়েট পদ্ধতি থেকে কাজগুলি অফলোড করতে সমস্যায় পড়ছি।

যখন আমি অ-অ্যাক্টিভিটি ক্লাস থেকে 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
প্রশ্নটিতে ব্যতিক্রম এবং স্ট্যাক ট্রেস যুক্ত করা সম্ভাব্য উত্তরদাতাদের সহায়তা করতে পারে
বার্ট এফ

হাই, ভুলের জন্য দুঃখিত যদি আমি এইটির সাথে ক্রিয়াকলাপের ক্লাসটি বাড়ানোর চেষ্টা করি তবে ব্যতিক্রম ছুঁড়ে দেওয়া হবে। আমি এই শ্রেণীর জন্য ক্রিয়াকলাপ শ্রেণি প্রসারিত করতে চাই না এবং কেবল আমার getLocation পদ্ধতির মধ্যে থেকে getSystemService কল করতে সক্ষম হতে চাই। ব্যতিক্রম: java.lang.IllegalStateException: OnCreate () এর আগে ক্রিয়াকলাপগুলিতে সিস্টেম পরিষেবা উপলব্ধ নয়
কেভিন পার্কার

উত্তর:


280

আপনার প্রবন্ধটি আপনার ফাইল ক্লাসে পাস করতে হবে ..
একটি সমাধান হ'ল আপনার 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);
    }
}

দুঃখিত, আমি এটি পাই না, কোড আরও সহায়ক হবে। আমার যদি কিছু লোকেশনম্যানেজারের অবজেক্টটি getLocation পদ্ধতিতে পাস করা উচিত ... তবে আমি সত্যিই দেখছি না যে আমাকে এই পদ্ধতির প্রসঙ্গটি কীভাবে সাহায্য করবে যখন আমি ক্রিয়াকলাপে বর্ধিত শ্রেণি হিসাবে এই ক্লাসটি না লিখে গেটসিস্টেম সার্ভিস কল করতে পারি না।
কেভিন পার্কার 4

তুমি কি এটা চেষ্টা করেছ? অনকারেতে যদি আপনি 'এটি' দ্বারা প্রসঙ্গটি অ্যাক্সেস করে
চলেছেন

তবে lmtক্লাসটি যদি মৃত্যুদন্ড কার্যকর না করে তবে flyপ্রসঙ্গে থাকবেন না
হান্ট

বিটিডাব্লু getSysytemService()কেবলমাত্র Stringপ্যারামিটার হিসাবে গ্রহণ করে । সুতরাং আপনি এটিতে একটি প্রসঙ্গ পাস করতে পারবেন নাআমি কিভাবে এই কাছাকাছি পেতে পারি? @ হান্ট
পার্থ

2
শুধু উল্লেখ, Android পরিচালকদের ( BluetoothManager, ActivityManagerইত্যাদি) রয়েছে নির্মাণ যে ভাবে (অগত্যা একটি ক্ষণস্থায়ী Activityতাদের কন্সট্রাকটর প্রসঙ্গ) এবং এই কারণে তারা আবেদন সুযোগ উপাদান অ্যাক্সেস করতে পারেন।
oদও 95

46

আপনি এটির জন্য যেতে পারেন:

getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);

5
getActivity () পদ্ধতিটি শ্রেণীর জন্য অপরিবর্তিত। এই ত্রুটিটি দেখায়।
দারপান

আপনি যে শ্রেণীর ধরণটি ব্যবহার করছেন তা কী? অর্থাত্ এটি একটি রিসিভার ক্লাস, টুকরা, সরল জাভা ক্লাস বা অন্য কোনও।
ম্যাডি

আপনার ক্রিয়াকলাপের পরিবর্তে FreagmentActivity দিয়ে আপনার ক্রিয়াকলাপটি প্রসারিত করতে হবে। আমি আশা করি এটি আপনার জন্য কাজ করবে ...?
ম্যাডি

এটি কোনও সরল শ্রেণীর জন্য কাজ করে না যেখানে আমি প্রসারিত করতে চাই ArrayAdapter
ডেভিড সিলভা-ব্যারেরা

2
আমার getActivity () এর পরিবর্তে getContext () ব্যবহার করে কাজ করেছে!
আমির ২

16

আমি এর চারপাশে যাবার একটি উপায় হ'ল উদাহরণগুলির জন্য একটি স্ট্যাটিক ক্লাস তৈরি করা। আমি এএস 3 তে এটি প্রচুর ব্যবহার করেছি আমি অ্যান্ড্রয়েড বিকাশেও আমার পক্ষে দুর্দান্ত কাজ করেছি।

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
এর মধ্যে একটি পার্থক্য হ'ল মাই অ্যাপে একটি প্রাইভেট স্ট্যাটিক রাখা এবং তারপরে গেটার যুক্ত করা। private static MyApp _context; public static MyApp getContext() { return _context; }... onCreate মধ্যে: _context = this; onStop মধ্যে: _context = null;... ব্যবহার: MyApp.getContext()
টুলমেকারস্টেভ

2
এটি মেমরি ফাঁস হতে পারে
Yat3s

2
এটি একেবারে মেমরি ফুটো হতে পারে। আদর্শভাবে আপনার এই প্রক্রিয়াটি ব্যবহার করা উচিত নয়।
সূচনা

0

আমি জানি না এটি সাহায্য করবে কিনা তবে আমি এটি করেছি:

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

সঠিক উপায়টি হ'ল স্থিতিশীল উপায়ে ব্যবহার করা, যেমন @ ম্যাডি বলেছেন
রাসেলহফ

0

ওয়ার্কারের মতো কিছু অ-কার্যকলাপের ক্লাসের জন্য, আপনি ইতিমধ্যে পাবলিক কনস্ট্রাক্টরে একটি প্রসঙ্গ বস্তুটি দিয়েছেন given

Worker(Context context, WorkerParameters workerParams)

আপনি কেবল এটি ব্যবহার করতে পারেন, উদাহরণস্বরূপ, এটি ক্লাসে একটি ব্যক্তিগত প্রসঙ্গের ভেরিয়েবলে সংরক্ষণ করুন (বলুন mContext) এবং তারপরে উদাহরণস্বরূপ

mContext.getSystenService(Context.ACTIVITY_SERVICE)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.