2013-08-27 46 views
2

我調查了該問題,但找不到任何解決方案代碼。我有四個班。但是我確定,在名爲Connect的類上沒有問題(您將在下面的類JsonData上看到它的對象)。所以我分享了其他三個類。我的主要活動是;IllegalStateException「系統服務不可用於onCreate()之前的活動()」

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

我從任何URL(它是私有的,我刪除它)對類JsonData發送的JSON鍵值,然後取數據;

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;

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;

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) 

我在說再次,我看了其他問題,但沒有解決方案可用於我。提前致謝。

+0

你需要的是一個實用工具類不是一個活動類 – Raghunandan

回答

4

InternetCheck是一個Activity類。活動由startActivity開始。 getSystemService需要活動上下文。

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

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. 

您可以連接到無線網絡,但無線網絡可能無法連接到網絡。這隻會檢查網絡連接的可用性。

編輯:

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; 
    } 
    } 
    } 
+0

我改變你的建議我的代碼。我認爲這是正確的方式,但同樣的錯誤仍在繼續。 –

+0

@Droid你也可以這樣做'JsonData jsonData = new JsonData()'。 JsonData是一個活動類,意圖是由'startActivity'啓動活動。也'連接 .connect(url)'所有網絡相關的操作應該在'thread'上完成。使用'thread'或'asynctask' – Raghunandan

+0

我使用了調試,問題出在InternetCheck類和點'context.getSystemService(Context.CONNECTIVITY_SERVICE))。getActiveNetworkInfo();'。我相信這一點。 –

2

您的JSONParser擴展了活動,但它不是一項活動。刪除extends Activity並將其作爲對象調用。

您還需要從InternetCheck類中刪除extends Activity。

那麼跟你context通過您的上下文的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); 

    } 

然後在您的InternetCheck類接受的構造背景和替換所有

getBaseContext() 

變量

+0

這是解決不了問題的,我試過了。 –

+0

不真實,這是解決方案。 –

0

試着改變:

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(); 
    } 
+0

但我必須將鍵值發送給JsonData類。 –

+0

你不能在onCreate之前這樣做,因爲它會導致錯誤。 – akuzma

+0

我試過了,這不是一個解決方案,但無論如何謝謝。 –

相關問題