2013-02-22 72 views
0

我打算从我的网站获取数据,然后将该信息放入微调器中。我用一些教程,我想出了这个代码Android系统服务不可用

package com.thenewboston.christian; 

import java.util.ArrayList; 
import java.util.List; 

import org.apache.http.NameValuePair; 
import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 

import android.app.Activity; 
import android.app.ProgressDialog; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.util.Log; 
import android.widget.ArrayAdapter; 
import android.widget.Spinner; 

public class hospitalhttp extends Activity{ 

private ProgressDialog pDialog; 
JSONParser jParser = new JSONParser(); 

private static String url_all_products = "http://www.photosbychristian.com/ems/hospitals.php"; 

//private static final String TAG_HID = "hid"; 
private static final String TAG_HOSPITAL = "hospital"; 

JSONArray hosps = null; 
ArrayAdapter <String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item); 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.spinnertest); 

    new LoadAllProducts().execute(); 

} 


class LoadAllProducts extends AsyncTask<String, String, String> { 

    /** 
    * Before starting background thread Show Progress Dialog 
    * */ 
    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     pDialog = new ProgressDialog(hospitalhttp.this); 
     pDialog.setMessage("Loading hospitals. Please wait..."); 
     pDialog.setIndeterminate(false); 
     pDialog.setCancelable(false); 
     pDialog.show(); 
    } 

    /** 
    * getting All products from url 
    * */ 
    protected String doInBackground(String... args) { 
     // Building Parameters 
     List<NameValuePair> params = new ArrayList<NameValuePair>(); 
     // getting JSON string from URL 
     JSONObject json = jParser.makeHttpRequest(url_all_products, "GET", 
       params); 

     // Check your log cat for JSON reponse 
     Log.d("All Products: ", json.toString()); 


     adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 

     try { 
      // products found 
      // Getting Array of Products 
      hosps = json.getJSONArray("PA"); 

      // looping through All Products 
      for (int i = 0; i < hosps.length(); i++) { 
       JSONObject c = hosps.getJSONObject(i); 

       // Storing each json item in variable 
       //String id = c.getString(TAG_HID); 
       String name = c.getString(TAG_HOSPITAL); 

       adapter.add(name); 

      } 

     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 

     return null; 
    } 

    /** 
    * After completing background task Dismiss the progress dialog 
    * **/ 
    protected void onPostExecute(String file_url) { 
     // dismiss the dialog after getting all products 
     pDialog.dismiss(); 
     // updating UI from Background Thread 
     runOnUiThread(new Runnable() { 
      public void run() { 
       /** 
       * Updating parsed JSON data into ListView 
       */ 

       Spinner state = (Spinner) findViewById(R.id.spinner1); 
       state.setAdapter(adapter); 

      } 
     }); 

    } 

} 
} 

我尝试运行我的应用程序和我得到这个错误

02-22 22:29:48.131: E/AndroidRuntime(1200): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.thenewboston.christian/com.thenewboston.christian.hospitalhttp}: java.lang.IllegalStateException: System services not available to Activities before onCreate() 

所以我把所有的这个OnCreate中bolck和我后仍然得到同样的错误

private ProgressDialog pDialog; 
JSONParser jParser = new JSONParser(); 

private static String url_all_products = "http://www.photosbychristian.com/ems/hospitals.php"; 

//private static final String TAG_HID = "hid"; 
private static final String TAG_HOSPITAL = "hospital"; 

JSONArray hosps = null; 
ArrayAdapter <String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item); 

,所以我不知道怎么知道的任何帮助,将不胜感激

+3

后整个堆栈跟踪 – 2013-02-22 22:46:39

回答

3

移动代码不会有帮助。 Java是一种范围内的语言,如果在某个方法之后或之前放置了某些内容,则无关紧要。它仍然在相同的范围内。

的问题可能是由该行提出:

ArrayAdapter <String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item); 

你想在对象加载布局范围的初始化。这种代码甚至在构造函数之前运行。您必须将值分配移动到onCreate方法是这样的:

ArrayAdapter <String> adapter; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.spinnertest); 

    adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item); 

    new LoadAllProducts().execute(); 
} 
+0

这是我需要感谢你 – cmb 2013-02-22 23:03:44

0

所以我把所有的这个OnCreate中bolck后,我仍然得到同样的错误

该代码不能是方法里面,因为你正在申报的静态值。因此,该代码必须驻留在任何方法之外,这意味着它将在执行任何方法之前执行,因此将在onCreate()之前执行。

东西在里面 - 可能是你JSONParser - 正在试图做一些事情,不能到完成后super.onCreate()onCreate()方法已经执行。您的Java堆栈跟踪将明确告诉您哪些行(如果有)是您的难题的来源。然后,您需要在调用super.onCreate()后执行该代码,例如将其置于onCreate()方法的末尾。

+0

岂不'adapter'宣言也惹的祸?这实际上是通过了一个上下文。 – 2013-02-22 22:54:45

+0

@ A - C:可能。但是我不会期望它在构造函数中尝试使用类似'LayoutInflater'的东西,所以这就是我为什么猜测'JSONParser'。 – CommonsWare 2013-02-22 23:21:10

相关问题