Aplikacja zamyka się po przeniesieniu funkcji do innej klasy

0

Cześć

Tworzę aplikację na Androida. Mam funkcję do sprawdzania połączenia z internetem. Wykorzystuję jej w każdym Activity więc postanowiłem stworzyć klasę Global w osobnym pliku i umieścić w niej zmienne globalne oraz poniższą funkcję.

public class Global extends ActionBarActivity{

    public boolean isNetworkConnected() {
        ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo ni = cm.getActiveNetworkInfo();
        if (ni == null) {
            return false;
        } else
            return true;
    }


}

W innym Activity odwołuję się do niej w ten sposób:

Global global = new Global(); // Umieszczam na samym początku, nad metodą onCreate

Kiedy chcę porównać czy jest true to piszę na przykład:

if(global.isNetworkConnected == true)

Niestety aplikacja wyłącza się po uruchomieniu tego Activity. Funkcja ta umieszczona wewnątrz tego samego pliku i wywołana działa prawidłowo. Dlaczego nie mogę wywołać jej z innego pliku ?

Exception jest następujący: System services not available to Activities before onCreate().

Jak to naprawić ?

1

No ale czego w tym komunikacie nie rozumiesz?

0

Nie wiem w który miejscu mam utworzyć obiektyw klasy Global skoro przed onCreate nie mogę :(

Kawałek kodu, który mi nie działa...

public class NewEntryActivity extends ActionBarActivity {

    EditText event;
    Button date;
    Button submit;
    DatePickerDialog calendar;
    int year,month,day;
    static final int DIALOG_ID = 0;

    String final_date = "";

    Global global = new Global();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ThreadPolicy policy = new ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);

        setContentView(R.layout.activity_new_entry);

        event = (EditText) findViewById(R.id.eventEditText);
        date = (Button) findViewById(R.id.selectDate);
        submit = (Button) findViewById(R.id.submitBtn);


        submit.setOnClickListener(new View.OnClickListener() {
            InputStream is = null;

            @Override
            public void onClick(View v) {
                String event_name;
                String event_date;
                Boolean error = false;

                //Toast.makeText(getApplicationContext(),String.valueOf(global.IConnect),Toast.LENGTH_LONG).show();

                if(global.isNetworkConnected() == false) {
                    error = true;
                    Toast.makeText(getApplicationContext(), getString(R.string.connectionerror), Toast.LENGTH_SHORT).show();
                }
2

Nie da sie tego "naprawić". To co zrobiłeś w ogóle nie ma zresztą sensu. Bo popełniłeś klasyczny błąd wynikający z tego że nie rozumiesz programowania obiektowego. Nie używa się dziedziczenia żeby uzyskać dostęp do jakichś metod których chciałbyś używać. Czy ta twoja klasa "Global" jest faktycznie avtivity? Nie jest... A że tworzysz sobie ten obiekt "ręcznie" to nie jest poprawnie zainicjalizowany i ta metoda której chciałeś użyć i tak nie będzie działać.

To co powinieneś zrobić to wywalić extendowanie activity z tej swojej klasy a zamiast tego przekazywać do niej Context jako argument konstruktora i używać Contextu do pobrania tych swoich global services. Tu masz jakieś przykłady: http://stackoverflow.com/questions/4870667/how-can-i-use-getsystemservice-in-a-non-activity-class-locationmanager

0

Ok poradziłem sobie. Oto poprawiona wersja klasy Global.

public class Global{

    Context mContext;
    public Global(Context mContext){
        this.mContext = mContext;
    }


    public boolean isNetworkConnected() {
        ConnectivityManager cm = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo ni = cm.getActiveNetworkInfo();
        if (ni == null) {
            return false;
        } else
            return true;
    }

}

Wątku jeszcze nie zamykam, bo pytań pojawi się pewnie sporo.
Kolejne jest następujące:
Czy po zalogowaniu się do konta w bazie MySQL dane o zalogowanym użytkowniku można przechowywać w SharedPreferences ? Jest to bezpieczne ?

1 użytkowników online, w tym zalogowanych: 0, gości: 1