ฉันจะใช้ getSystemService ในคลาสที่ไม่ใช่กิจกรรม (LocationManager) ได้อย่างไร


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
การเพิ่มข้อยกเว้นและการติดตามสแต็คไปยังคำถามอาจช่วยผู้ตอบคำถามที่อาจเป็นไปได้
Bert F

สวัสดีขออภัยด้วยความผิดพลาด ข้อยกเว้นถูกส่งออกไปถ้าฉันพยายามขยายคลาสของกิจกรรมด้วยอันนี้ ฉันไม่ต้องการขยายคลาสกิจกรรมสำหรับคลาสนี้และเพียงต้องการให้สามารถเรียกใช้ getSystemService จากภายในเมธอด getLocation ของฉัน ข้อยกเว้น: java.lang.IllegalStateException: บริการของระบบไม่พร้อมใช้งานสำหรับกิจกรรมก่อน onCreate ()
Kevin Parker

คำตอบ:


280

คุณต้องผ่านบริบทของคุณไปยังคลาส fyl ของคุณ ..
วิธีหนึ่งคือสร้างคอนสตรัคแบบนี้ให้กับfylคลาสของคุณ:

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

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

       --
 }
}

ดังนั้นในคลาสกิจกรรมของคุณให้สร้างวัตถุของ fyl ใน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);
    }
}

ขออภัยฉันไม่ได้รับรหัสจะเป็นประโยชน์มากขึ้น หากสิ่งใดที่ฉันควรส่งวัตถุ LocationManager ไปยังวิธีการ getLocation ... ฉันไม่เห็นว่าฉันผ่านบริบทไปยังวิธีการนี้จะช่วยอย่างไรเมื่อฉันไม่สามารถเรียก getSystemService ได้โดยไม่ต้องเขียนคลาสนี้เป็นคลาสที่ขยายไปยังกิจกรรม
Kevin Parker

คุณลองสิ่งนี้ไหม ใน onCreate หากคุณผ่านการเข้าถึงบริบทโดย 'this'
Labeeb Panampullan

แต่ถ้าlmtชั้นเรียนไม่ถูกประหารก็flyจะไม่มีบริบท
ล่า

BTW getSysytemService()ยอมรับStringว่าเป็นพารามิเตอร์เท่านั้น ดังนั้นคุณไม่สามารถส่งผ่านบริบทได้ ฉันจะรับสิ่งนี้ได้อย่างไร @Hunt
Parth Sane

2
เพียงแค่พูดถึงผู้จัดการ Android ( BluetoothManager, ActivityManagerฯลฯ ) นอกจากนี้ยังมีการสร้างวิธีการที่ (ไม่จำเป็นต้องส่งผ่านActivityบริบทคอนสตรัคของพวกเขา) และนี่คือเหตุผลที่พวกเขาสามารถเข้าถึงส่วนประกอบอยู่ในขอบเขตการประยุกต์ใช้
Eido95

47

คุณสามารถทำสิ่งนี้ได้:

getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);

5
getActivity () วิธีการไม่ได้กำหนดไว้สำหรับชั้นเรียน ข้อผิดพลาดนี้จะปรากฏขึ้น
Darpan

คลาสประเภทใดที่คุณใช้งานอยู่ นั่นคือมันเป็นคลาสผู้รับ, ส่วน, คลาส Java ง่าย ๆ หรืออื่น ๆ
แมดดี้

คุณต้องขยายกิจกรรมของคุณด้วย FreagmentActivity แทนที่จะเป็นกิจกรรม ฉันหวังว่ามันจะทำงานให้คุณ ... ?
Maddy

ArrayAdapterมันไม่ทำงานสำหรับการเรียนที่ง่ายที่ฉันต้องการที่จะขยาย
David Silva-Barrera

2
MIne ทำงานโดยใช้ getContext () แทน getActivity ()!
อาเมียร์

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
ปัญหาที่ฉันเห็นด้วยวิธีนี้คือมันทำให้บางสิ่งที่ไม่มีการป้องกันหากใครบางคนกำหนดให้เป็นโมฆะมันอาจจะทำให้เกิดความล้มเหลวได้
Rob

2
การเปลี่ยนแปลงในเรื่องนี้คือการใส่สแตติกส่วนตัวใน MyApp แล้วเพิ่ม getters private static MyApp _context; public static MyApp getContext() { return _context; }... ใน onCreate: _context = this; ใน onStop: _context = null;... MyApp.getContext()การใช้งาน:
ToolmakerSteve

2
อาจนำไปสู่การรั่วไหลของหน่วยความจำ
Yat3s

2
สิ่งนี้จะนำไปสู่การรั่วไหลของหน่วยความจำอย่างแน่นอน เป็นการดีที่คุณไม่ควรใช้กระบวนการนี้
เริ่มต้น

0

ฉันไม่รู้ว่าจะช่วยได้หรือไม่ แต่ฉันทำอย่างนี้:

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

วิธีที่ถูกต้องคือใช้อย่างคงที่ตามที่ @Maddy กล่าว
russellhoff

0

สำหรับบางคลาสที่ไม่ใช่กิจกรรมเช่นWorkerคุณได้รับวัตถุบริบทในตัวสร้างสาธารณะแล้ว

Worker(Context context, WorkerParameters workerParams)

คุณสามารถใช้สิ่งนั้นได้เช่นบันทึกลงในตัวแปรบริบทส่วนบุคคลในคลาส (พูด, mContext) จากนั้นยกตัวอย่างเช่น

mContext.getSystenService(Context.ACTIVITY_SERVICE)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.