eclipse IllegalStateException “系统服务在 onCreate() 之前不可用于活动”
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/18460055/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
IllegalStateException "System services not available to Activities before onCreate()"
提问by Batuhan Co?kun
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;
我调查了这个问题,但找不到我的代码的任何解决方案。我有四节课。但我确信,名为 Connect 的类没有问题(您将在下面的 JsonData 类上看到它的对象。)所以我共享其他三个类。我的主要活动是;
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();
}
}
I send keyvalues for json and then take data from any url(it is private, i delete it) on class JsonData;
我发送 json 的键值,然后从 JsonData 类上的任何 url(它是私有的,我删除它)获取数据;
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;
}
}
In this class, i check internet connection from object netCheck. I think my problem is on that class. InternetCheck.java;
在这门课中,我从对象 netCheck 检查互联网连接。我想我的问题是在那堂课上。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;
}
}
I am suspecting from the commented line **//get Connectivity Manager object to check connection ** . Finally my Logcat;
我怀疑从注释行 **//get Connectivity Manager object to check connection ** 。最后是我的 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.access00(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.
我再说一遍,我查看了其他问题,但没有可用的解决方案。提前致谢。
回答by Raghunandan
InternetCheck
is a Activity class. Activity is started by startActivity
. getSystemService
requires activity context.
InternetCheck
是一个活动类。活动由 开始startActivity
。getSystemService
需要活动上下文。
You have this
你有这个
public class JsonData extends Activity
And you do this
你这样做
JsonData jsonData = new JsonData(); //Activity is started by `startActivity`
// wrong
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
您需要的是实用程序类而不是活动类。此外,如果您正在执行网络相关操作,请在thread
或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;
}
}
}
}
To check in any activity
签入任何活动
if(CheckNetwork.isInternetAvailable(ActivityName.this))
// use activity context
// will return true if network connection is available.
You may be connected to wifi but wifi may not be connect to net. This only checks for network connection availability.
您可能已连接到 wifi,但 wifi 可能无法连接到网络。这仅检查网络连接可用性。
Edit:
编辑:
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;
}
}
}
回答by Reid L Skipworth
Your JSONParser extends activity but it's not an activity. Remove the extends Activity and call it as an object.
您的 JSONParser 扩展了活动,但它不是活动。移除 extends Activity 并将其作为对象调用。
You'll also need to remove the extends Activity from your InternetCheck class.
您还需要从 InternetCheck 类中删除 extends Activity。
Then pass your context to the JSONData class and use your InternetCheck class like this
然后将您的上下文传递给 JSONData 类并像这样使用您的 InternetCheck 类
public class JsonData extends Activity{
Connect connect = new Connect();
private String url = "url";
static String keys[];
public JsonData(Context context){
InternetCheck netCheck = new InternetCheck(context);
}
Then in your InternetCheck class accept the context in the constructor and replace all
然后在您的 InternetCheck 类中接受构造函数中的上下文并替换所有
getBaseContext()
with your context
variable
用你的context
变量
回答by akuzma
Try to change:
尝试改变:
public class MainActivity extends Activity {
@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();
}