2013-08-23 2 views
0

Я разрабатываю приложение для Android, в котором я должен проверить, является ли устройство в режиме онлайн или в автономном режиме (т. Е. Мне нужно проверить, доступна ли служба подключения или не).Android-Не удалось вызвать метод из другой активности

У меня есть класс класса А и класс B.

В классе А, я попробовал фрагменты кода, как показано ниже,

package com.example.onlineverification; 

import android.os.Bundle; 
import android.app.Activity; 
import android.view.Menu; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.Toast; 

public class MainActivity extends Activity { 

    @Override 
    protected void onCreate(final Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Button b=(Button)findViewById(R.id.button1); 
     b.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       //new OnlineCheck().onCreate(savedInstanceState) 
       Toast.makeText(MainActivity.this,"Online Verification "+new OnlineCheck().isOnline(), Toast.LENGTH_LONG).show(); 

      } 
     }); 



     } 

} 

В классе В, фрагменты кода, которые я попытался приведен ниже,

package com.example.onlineverification; 

import android.app.Activity; 
import android.content.Context; 
import android.net.ConnectivityManager; 
import android.net.NetworkInfo; 
import android.os.Bundle; 


public class OnlineCheck extends Activity 
{ 



    public boolean isOnline() { 

     ConnectivityManager conMgr = (ConnectivityManager) this 
       .getSystemService(Context.CONNECTIVITY_SERVICE); 

     NetworkInfo[] networkInfo = conMgr.getAllNetworkInfo(); 

     boolean state=false; 

     for(NetworkInfo nInfo:networkInfo){ 
      if(nInfo.getType()==ConnectivityManager.TYPE_WIFI || nInfo.getType()==ConnectivityManager.TYPE_ETHERNET || nInfo.getType()==ConnectivityManager.TYPE_MOBILE){ 
      if (nInfo.getState() == NetworkInfo.State.CONNECTED 
        || nInfo.getState() == NetworkInfo.State.CONNECTING) { 

       state=true; 
       break; 

      } 
      } 
     } 


     return state; 
    } 

} 

, когда я нажимаю кнопка, Заявка разбилась, и моя ошибка Logcat приводятся ниже,

08-23 10:55:29.152: E/AndroidRuntime(25945): FATAL EXCEPTION: main 
08-23 10:55:29.152: E/AndroidRuntime(25945): java.lang.IllegalStateException: System services not available to Activities before onCreate() 
08-23 10:55:29.152: E/AndroidRuntime(25945): at android.app.Activity.getSystemService(Activity.java:4463) 
08-23 10:55:29.152: E/AndroidRuntime(25945): at com.example.onlineverification.OnlineCheck.isOnline(OnlineCheck.java:18) 
08-23 10:55:29.152: E/AndroidRuntime(25945): at com.example.onlineverification.MainActivity$1.onClick(MainActivity.java:24) 
08-23 10:55:29.152: E/AndroidRuntime(25945): at android.view.View.performClick(View.java:4204) 
08-23 10:55:29.152: E/AndroidRuntime(25945): at android.view.View$PerformClick.run(View.java:17355) 
08-23 10:55:29.152: E/AndroidRuntime(25945): at android.os.Handler.handleCallback(Handler.java:725) 
08-23 10:55:29.152: E/AndroidRuntime(25945): at android.os.Handler.dispatchMessage(Handler.java:92) 
08-23 10:55:29.152: E/AndroidRuntime(25945): at android.os.Looper.loop(Looper.java:137) 
08-23 10:55:29.152: E/AndroidRuntime(25945): at android.app.ActivityThread.main(ActivityThread.java:5041) 
08-23 10:55:29.152: E/AndroidRuntime(25945): at java.lang.reflect.Method.invokeNative(Native Method) 
08-23 10:55:29.152: E/AndroidRuntime(25945): at java.lang.reflect.Method.invoke(Method.java:511) 
08-23 10:55:29.152: E/AndroidRuntime(25945): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
08-23 10:55:29.152: E/AndroidRuntime(25945): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
08-23 10:55:29.152: E/AndroidRuntime(25945): at dalvik.system.NativeStart.main(Native Method) 
+0

-u только что использовало статическое ключевое слово для вызова метода в другом классе. – FarhaSameer786

+1

Зачем вам класть такой маленький код в такой класс. Просто держите его в своей первоначальной деятельности. – NightSkyCode

+0

См. Мой ответ и попробуйте. Дайте мне знать, если есть какая-либо проблема. –

ответ

0

Это ваш B класс

import android.app.Activity; 
import android.content.Context; 
import android.net.ConnectivityManager; 
import android.net.NetworkInfo; 
import android.os.Bundle; 

public class OnlineCheck 
{ 
    public boolean isOnline(Context context) { 

     ConnectivityManager conMgr = (ConnectivityManager) context 
       .getSystemService(Context.CONNECTIVITY_SERVICE); 

     NetworkInfo[] networkInfo = conMgr.getAllNetworkInfo(); 

     boolean state=false; 

     for(NetworkInfo nInfo:networkInfo){ 
      if(nInfo.getType()==ConnectivityManager.TYPE_WIFI || nInfo.getType()==ConnectivityManager.TYPE_ETHERNET || nInfo.getType()==ConnectivityManager.TYPE_MOBILE){ 
      if (nInfo.getState() == NetworkInfo.State.CONNECTED 
        || nInfo.getState() == NetworkInfo.State.CONNECTING) { 

       state=true; 
       break; 

      } 
      } 
     } 


     return state; 
    } 

} 

и призовите с следующим кодом

Toast.makeText(MainActivity.this,"Online Verification "+ new OnlineCheck().isOnline(MainActivity.this), Toast.LENGTH_LONG).show(); 
+0

Какая наихудшая реализация! и получил upvote слишком –

+0

Вы должны попробовать в первую очередь. Я знаю, где проблема, и я не думаю, что я должен запустить этот код. –

+0

И не является копией моего решения: D –

0

Здесь вы получаете IllegalException это означает, что она не действует в андроиде

Runtime(25945): FATAL EXCEPTION: main 
08-23 10:55:29.152: E/AndroidRuntime(25945):java.lang.IllegalStateException: System services not available to Activities before onCreate() 
08-23 10:55:29.152: E/AndroidRuntime(25945):at android.app.Activity.getSystemService(Activity.java:4463) 

Я предлагаю вам сделать что-то вроде этот

1) BaseActivity extends Activity 
2) OnlineCheck extends BaseActivity 
3) MainActivity extends BaseActivity 

тогда код, который используется в bo го действия записывают его в BaseActivity.

0

Проблема заключается в том, что вы создаете экземпляр вашего OnlineCheck без прохождения надлежащих каналов для создания Activity. Вы должны либо изменить действия на свою онлайн-активность, либо переместить isOnline() в MainActivity.

См. How to start new activity on button click для начала деятельности изнутри другой.

Суть его в том, что вы не можете просто вызвать новый MyActivity(). Этот процесс не предназначен для инициализации.

EDIT:

Это может работать, если вы действительно очень хотите в классе броньПроверить

Toast.makeText(MainActivity.this,"Online Verification "+OnlineCheck.isOnline(this), Toast.LENGTH_LONG).show(); 

public class OnlineCheck extends Activity 
{ 



    public static boolean isOnline(Activity source) { 

     ConnectivityManager conMgr = (ConnectivityManager) source 
       .getSystemService(Context.CONNECTIVITY_SERVICE); 

     NetworkInfo[] networkInfo = conMgr.getAllNetworkInfo(); 

     boolean state=false; 

     for(NetworkInfo nInfo:networkInfo){ 
      if(nInfo.getType()==ConnectivityManager.TYPE_WIFI || nInfo.getType()==ConnectivityManager.TYPE_ETHERNET || nInfo.getType()==ConnectivityManager.TYPE_MOBILE){ 
      if (nInfo.getState() == NetworkInfo.State.CONNECTED 
        || nInfo.getState() == NetworkInfo.State.CONNECTING) { 

       state=true; 
       break; 

      } 
      } 
     } 


     return state; 
    } 

} 
3

Не вызывайте этот метод из деятельности. Создайте отдельный класс и определите этот метод как статический. , как показано ниже

import android.content.Context; 
import android.net.ConnectivityManager; 
import android.net.NetworkInfo; 

public class NetworkUtils { 

    public static boolean isOnline(Context mContext) { 
     ConnectivityManager conMgr = (ConnectivityManager) mContext 
       .getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo[] networkInfo = conMgr.getAllNetworkInfo(); 
     boolean state = false; 
     for (NetworkInfo nInfo : networkInfo) { 
      if (nInfo.getType() == ConnectivityManager.TYPE_WIFI 
        || nInfo.getType() == ConnectivityManager.TYPE_ETHERNET 
        || nInfo.getType() == ConnectivityManager.TYPE_MOBILE) { 
       if (nInfo.getState() == NetworkInfo.State.CONNECTED 
         || nInfo.getState() == NetworkInfo.State.CONNECTING) { 
        state = true; 
        break; 
       } 
      } 
     } 
     return state; 
    } 
} 

И вызывать этот метод в деятельности, как

NetworkUtils.isOnline(MainActivity.this); 

В вашем случае

Toast.makeText(MainActivity.this,"Online Verification "+NetworkUtils.isOnline(MainActivity.this), Toast.LENGTH_LONG).show(); 
+1

Отличный ответ, невероятно полезный – PALEN

0

На 2.Активность Импорт MainActivity первый

Например, вы на 2.Activity и Вы вызываете метод от 2.Activity По имени MainActivity метода callMethode()

активность 1 (например, на MainActivity)

public static void callMethode(Context context){ 
    // Your codes Here 
    } 

активность 2

MainActivity.callMethode(getApplicationContext()); 
Смежные вопросы