Làm cách nào tôi có thể sử dụng getSystemService trong một lớp không hoạt động (LocationManager)?


181

Tôi gặp sự cố khi giảm tải các tác vụ từ phương thức Hoạt động chính trên lớp sang một lớp khác để thực hiện việc nâng vật nặng.

Khi tôi cố gắng gọi getSystemService từ lớp không Hoạt động, một ngoại lệ được đưa ra.

Mọi sự trợ giúp sẽ rất được trân trọng :)

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
Thêm ngoại lệ và dấu vết ngăn xếp vào câu hỏi có thể giúp người trả lời tiềm năng
Bert F

Xin chào, xin lỗi vì sai lầm. Ngoại lệ được ném nếu tôi cố gắng mở rộng lớp Activity bằng cái này. Tôi không muốn mở rộng lớp Activity cho lớp này và chỉ muốn có thể gọi getSystemService từ bên trong phương thức getLocation của tôi. Ngoại lệ: java.lang.IllegalStateException: Dịch vụ hệ thống không khả dụng cho Hoạt động trước onCreate ()
Kevin Parker

Câu trả lời:


280

Bạn cần chuyển ngữ cảnh của bạn đến lớp fyl của bạn ..
Một giải pháp là tạo một hàm tạo như thế này cho fyllớp của bạn :

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

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

       --
 }
}

Vì vậy, trong lớp hoạt động của bạn tạo đối tượng của fyl trong onCreatehàm như thế này:

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);
    }
}

Xin lỗi tôi không nhận được nó, mã sẽ hữu ích hơn. Nếu bất cứ điều gì tôi nên chuyển một đối tượng LocationManager cho phương thức getLocation ... Tôi thực sự không thấy cách tôi chuyển ngữ cảnh sang phương thức sẽ giúp ích khi tôi thậm chí không thể gọi getSystemService mà không viết lớp này thành lớp mở rộng cho Activity.
Kevin Parker

bạn đã thử nó chưa Trong onCreate nếu bạn đang truy cập vào bối cảnh bằng 'cái này'
Labeeb Panampullan

nhưng nếu lmtlớp không được thực thi thì flysẽ không có bối cảnh
Hunt

BTW getSysytemService()chỉ chấp nhận Stringnhư một tham số. Vì vậy, bạn không thể vượt qua một bối cảnh cho nó. Làm thế nào để tôi có được xung quanh này? @Hunt
Parth Sane

2
Chỉ cần đề cập, các trình quản lý Android ( BluetoothManager, ActivityManagerv.v.) cũng được xây dựng theo cách đó (không nhất thiết phải chuyển Activityngữ cảnh cho nhà xây dựng của họ) và đây là lý do tại sao họ có thể truy cập các thành phần trong phạm vi ứng dụng.
Eido95

47

Bạn có thể làm điều này:

getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);

5
Phương thức getActivity () không được xác định cho lớp. Lỗi này hiện lên.
Darpan

Loại lớp mà bạn đang sử dụng nó là gì? tức là nó là một lớp người nhận, đoạn, lớp java đơn giản hoặc bất kỳ lớp nào khác.
Maddy

Bạn cần mở rộng Hoạt động của mình bằng FreajectionActivity thay vì một Hoạt động. Tôi hy vọng nó sẽ làm việc cho bạn ...?
Maddy

Nó không hoạt động cho một lớp đơn giản mà tôi muốn mở rộng ArrayAdapter.
David Silva-Barrera

2
MIne hoạt động bằng cách sử dụng getContext () thay vì getActivity ()!
Amir

16

Một cách tôi đã khắc phục điều này là tạo một lớp tĩnh cho các thể hiện. Tôi đã sử dụng nó rất nhiều trong AS3 Tôi cũng đã làm việc rất tốt cho tôi trong quá trình phát triển Android.

Cấu hình

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;
    }
    ...
}

Sau đó, bạn có thể truy cập vào bối cảnh hoặc bằng cách sử dụng Config.context

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

4
Vấn đề tôi thấy với phương pháp này là nó để lại một thứ không được bảo vệ rằng, nếu ai đó gán null cho nó, có lẽ sẽ tạo ra một thất bại thảm hại?
Cướp

2
Một biến thể của điều này là đặt một tĩnh riêng trong MyApp và sau đó thêm getters. private static MyApp _context; public static MyApp getContext() { return _context; }... trong onCreate: _context = this; trong onStop: _context = null;... Cách sử dụng : MyApp.getContext().
ToolmakerSteve

2
Nó có thể dẫn đến rò rỉ bộ nhớ
Yat3s

2
Điều này hoàn toàn sẽ dẫn đến rò rỉ bộ nhớ. Tốt nhất bạn không nên sử dụng quy trình này.
người mới bắt đầu

0

Tôi không biết nếu điều này sẽ giúp, nhưng tôi đã làm điều này:

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

Cách đúng là sử dụng một cách tĩnh, như @Maddy nói
russellhoff

0

Đối với một số lớp không hoạt động, như Công nhân , bạn đã được cung cấp một đối tượng Ngữ cảnh trong hàm tạo công khai.

Worker(Context context, WorkerParameters workerParams)

Bạn chỉ có thể sử dụng nó, ví dụ, lưu nó vào một biến bối cảnh riêng tư trong lớp (giả sử mContext), và sau đó, ví dụ,

mContext.getSystenService(Context.ACTIVITY_SERVICE)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.