IllegalStateException"onCreate()之前Activities无法使用的系统服务" [英] IllegalStateException "System services not available to Activities before onCreate()"

查看:116
本文介绍了IllegalStateException"onCreate()之前Activities无法使用的系统服务"的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我调查了该问题,但找不到我的代码的任何解决方案.我有四节课.但是我敢肯定,在名为Connect的类上没有问题(您将在下面的JsonData类上看到它的对象.)因此,我共享其他三个类.我的MainActivity是;

I investigate that problem but can not find any solution for my code. I have four classes. But i am sure, no problem on class named Connect(You will see its object on class JsonData below.)So i share the other three classes. My MainActivity is;

public class MainActivity extends Activity {

    String keys[] = {"Message", "Subject", "MessageType", "SentTime", "ToName", "Id"};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        JsonData.keys=keys;

        JsonData jsonData = new JsonData();
        ArrayList<HashMap<String, String>> dataList = new ArrayList<HashMap<String, String>>();
        dataList= jsonData.GetData();
    }
}

我发送json的键值,然后从类JsonData上的任何url(它是私有的,我将其删除)中获取数据;

I send keyvalues for json and then take data from any url(it is private, i delete it) on class JsonData;

public class JsonData extends Activity{

    Connect connect = new Connect();
    private String url = "url"; 

    static String keys[];

    public ArrayList<HashMap<String, String>> GetData() {

        JSONArray json = null;
        ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>();
        InternetCheck netCheck = new InternetCheck();
        if(netCheck.isInternetOn()){
            try {
                JSONObject result = connect
                    .connect(url);
                json = result.getJSONArray("d");

                for (int i = 0; i < json.length(); i++) {
                    HashMap<String, String> hashmap = new HashMap<String, String>();
                    JSONObject json2 = json.getJSONObject(i);
                    for (int j = 0; j < keys.length; j++){
                        hashmap.put(keys[j], json2.getString(keys[j]));
                    }
                    mylist.add(hashmap);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }   
        } 
        else
            Toast.makeText(this, " Check Internet Options. ", Toast.LENGTH_LONG).show();
        return mylist;

    }
}

在本课中,我从对象netCheck检查互联网连接.我认为我的问题在那堂课上. InternetCheck.java ;

In this class, i check internet connection from object netCheck. I think my problem is on that class. InternetCheck.java ;

public class InternetCheck extends Activity {

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    }

    public final boolean isInternetOn() {

        // get Connectivity Manager object to check connection
        ConnectivityManager connec =  (ConnectivityManager)getSystemService(getBaseContext().CONNECTIVITY_SERVICE);

        // Check for network connections
        if ( connec.getNetworkInfo(0).getState() == android.net.NetworkInfo.State.CONNECTED ||
             connec.getNetworkInfo(0).getState() == android.net.NetworkInfo.State.CONNECTING ||
             connec.getNetworkInfo(1).getState() == android.net.NetworkInfo.State.CONNECTING ||
             connec.getNetworkInfo(1).getState() == android.net.NetworkInfo.State.CONNECTED ) {
            return true;

        } else if ( connec.getNetworkInfo(0).getState() == android.net.NetworkInfo.State.DISCONNECTED ||  connec.getNetworkInfo(1).getState() == android.net.NetworkInfo.State.DISCONNECTED  ) {
            return false;
        }
        return false;
    }
}

我怀疑从注释行**//获取Connectivity Manager对象来检查连接**. 最后是我的Logcat;

I am suspecting from the commented line **//get Connectivity Manager object to check connection ** . Finally my Logcat;

08-27 10:13:45.449: E/AndroidRuntime(24925): FATAL EXCEPTION: main
08-27 10:13:45.449: E/AndroidRuntime(24925): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.jsonparser/com.example.jsonparser.MainActivity}: java.lang.IllegalStateException: System services not available to Activities before onCreate()
08-27 10:13:45.449: E/AndroidRuntime(24925):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1659)
08-27 10:13:45.449: E/AndroidRuntime(24925):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1675)
08-27 10:13:45.449: E/AndroidRuntime(24925):    at android.app.ActivityThread.access$1500(ActivityThread.java:121)
08-27 10:13:45.449: E/AndroidRuntime(24925):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:943)
08-27 10:13:45.449: E/AndroidRuntime(24925):    at android.os.Handler.dispatchMessage(Handler.java:99)
08-27 10:13:45.449: E/AndroidRuntime(24925):    at android.os.Looper.loop(Looper.java:130)
08-27 10:13:45.449: E/AndroidRuntime(24925):    at android.app.ActivityThread.main(ActivityThread.java:3768)
08-27 10:13:45.449: E/AndroidRuntime(24925):    at java.lang.reflect.Method.invokeNative(Native Method)
08-27 10:13:45.449: E/AndroidRuntime(24925):    at java.lang.reflect.Method.invoke(Method.java:507)
08-27 10:13:45.449: E/AndroidRuntime(24925):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:878)
08-27 10:13:45.449: E/AndroidRuntime(24925):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:636)
08-27 10:13:45.449: E/AndroidRuntime(24925):    at dalvik.system.NativeStart.main(Native Method)
08-27 10:13:45.449: E/AndroidRuntime(24925): Caused by: java.lang.IllegalStateException: System services not available to Activities before onCreate()
08-27 10:13:45.449: E/AndroidRuntime(24925):    at android.app.Activity.getSystemService(Activity.java:3536)
08-27 10:13:45.449: E/AndroidRuntime(24925):    at com.example.jsonparser.InternetCheck.isInternetOn(InternetCheck.java:19)
08-27 10:13:45.449: E/AndroidRuntime(24925):    at com.example.jsonparser.JsonData.GetData(JsonData.java:25)
08-27 10:13:45.449: E/AndroidRuntime(24925):    at com.example.jsonparser.MainActivity.onCreate(MainActivity.java:21)
08-27 10:13:45.449: E/AndroidRuntime(24925):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
08-27 10:13:45.449: E/AndroidRuntime(24925):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1623)

我再说一遍,我查看了其他问题,但没有适合我的解决方案.预先感谢.

I'm saying again, i looked over other questions but no solution available for me. Thanks in advance.

推荐答案

InternetCheck是一个Activity类.活动由startActivity开始. getSystemService需要活动上下文.

InternetCheck is a Activity class. Activity is started by startActivity. getSystemService requires activity context.

http://developer.android .com/reference/android/content/Context.html#getSystemService(java.lang.String)

你有这个

public class JsonData extends Activity

而你这样做

JsonData jsonData = new JsonData(); //Activity is started by `startActivity`
// wrong  

您需要的是实用程序类而不是活动类.另外,如果您要进行与网络相关的操作,请在threadAsynctask

What you need is a utility class not an activity class. Also if you are doing network related operation do it in a thread or Asynctask

public class CheckNetwork {


    private static final String TAG = CheckNetwork.class.getSimpleName();



    public static boolean isInternetAvailable(Context context)
    {
        NetworkInfo info = (NetworkInfo) ((ConnectivityManager)
        context.getSystemService(Context.CONNECTIVITY_SERVICE)).getActiveNetworkInfo();

        if (info == null)
        {
             Log.d(TAG,"no internet connection");
             return false;
        }
        else
        {
            if(info.isConnected())
            {
                Log.d(TAG," internet connection available...");
                return true;
            }
            else
            {
                Log.d(TAG," internet connection");
                return true;
            }

        }
    }
}

要签入任何活动

 if(CheckNetwork.isInternetAvailable(ActivityName.this)) 
 // use activity context
 // will return true if network connection is available.

您可能已连接到wifi,但wifi可能未连接到网络.这只会检查网络连接的可用性.

You may be connected to wifi but wifi may not be connect to net. This only checks for network connection availability.

    public class MainActivity extends Activity {

        String keys[] = {"Message", "Subject", "MessageType", "SentTime", "ToName", "Id"};
        ArrayList<HashMap<String, String>> dataList = new ArrayList<HashMap<String, String>>();
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
                if(CheckNetwork.isInternetAvailable(MainActivity.this)) 
                {
            JsonData jsonData = new JsonData();
            jsonData.execute();
                }else
                 {
                  //display toast no network connection available
                 }   

        }

        public void getData()
        {

                // get json data from url and it to dataList   

            }
  class JsonData extends AsyncTask<Void,Void,Void>{
  private String url = "url"; 

    @Override
protected void onPostExecute(Void result) {
    // TODO Auto-generated method stub
    super.onPostExecute(result);
    // dismiss progress dialog
    // update ui
}

@Override
protected void onPreExecute() {
    // TODO Auto-generated method stub
    super.onPreExecute();
    // display progress dialog
}

    @Override
    protected Void doInBackground(Void... params) {
      getData(); // get data
       // network related operation
       //  do not update ui here.             
    return null;
    }
    }
    }

这篇关于IllegalStateException"onCreate()之前Activities无法使用的系统服务"的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆