0

我正在尝试检索 Foursquare 场地列表。我有一个异步类来解析 Json,另一个来创建和显示列表。但我有一些错误,如解析错误、nullpointerexception..而且我不知道如何解决这个问题。我要解析的 Json 来自foursquare url。例如https://api.foursquare.com/v2/venues/search?ll=40.7,-74&radius=0&client_id=50QO00GZKUPA25PDGO1IY3UHMK3IBEMO2F4CTO5M2DBLVGQD&client_secret=MVJZGC3WT4V55DQPJYBFNZ5X3IACIDLFVM1HKA2WBTEHAXDF&v=201

这是logCat

07-24 12:39:06.485: E/SensorManager(19711): thread start
07-24 12:39:06.495: D/SensorManager(19711): registerListener :: handle = 0  name= K3DH Acceleration Sensor delay= 200000 Trklfufi 9 budiwrd5mrfo5WirfulblrwuFmfulTrklfufi$KfukwiFmfulTrklfufiRvht@,)8e(:e8
07-24 12:39:10.455: E/fail!(19711): Error convert stream to String: java.lang.NullPointerException
07-24 12:39:10.455: E/fail!(19711): Error convert stream to String: java.lang.NullPointerException
07-24 12:39:10.455: E/JSON Parser(19711): Error parsing data org.json.JSONException: End of input at character 0 of 
07-24 12:39:10.455: E/JSON Parser(19711): Error parsing data org.json.JSONException: End of input at character 0 of 
07-24 12:39:10.455: D/AndroidRuntime(19711): Shutting down VM
07-24 12:39:10.455: W/dalvikvm(19711): threadid=1: thread exiting with uncaught exception (group=0x41e7f2a0)
07-24 12:39:10.460: E/AndroidRuntime(19711): FATAL EXCEPTION: main
07-24 12:39:10.460: E/AndroidRuntime(19711): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.mykong.android/com.mykong.android.JSonResultActivity}: java.lang.NullPointerException
07-24 12:39:10.460: E/AndroidRuntime(19711):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2110)
07-24 12:39:10.460: E/AndroidRuntime(19711):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2135)
07-24 12:39:10.460: E/AndroidRuntime(19711):    at android.app.ActivityThread.access$700(ActivityThread.java:140)
07-24 12:39:10.460: E/AndroidRuntime(19711):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1237)
07-24 12:39:10.460: E/AndroidRuntime(19711):    at android.os.Handler.dispatchMessage(Handler.java:99)
07-24 12:39:10.460: E/AndroidRuntime(19711):    at android.os.Looper.loop(Looper.java:137)
07-24 12:39:10.460: E/AndroidRuntime(19711):    at android.app.ActivityThread.main(ActivityThread.java:4921)
07-24 12:39:10.460: E/AndroidRuntime(19711):    at java.lang.reflect.Method.invokeNative(Native Method)
07-24 12:39:10.460: E/AndroidRuntime(19711):    at java.lang.reflect.Method.invoke(Method.java:511)
07-24 12:39:10.460: E/AndroidRuntime(19711):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1027)
07-24 12:39:10.460: E/AndroidRuntime(19711):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)
07-24 12:39:10.460: E/AndroidRuntime(19711):    at dalvik.system.NativeStart.main(Native Method)
07-24 12:39:10.460: E/AndroidRuntime(19711): Caused by: java.lang.NullPointerException
07-24 12:39:10.460: E/AndroidRuntime(19711):    at com.mykong.android.JSonResultActivity.onCreate(JSonResultActivity.java:65)
07-24 12:39:10.460: E/AndroidRuntime(19711):    at android.app.Activity.performCreate(Activity.java:5206)
07-24 12:39:10.460: E/AndroidRuntime(19711):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1094)
07-24 12:39:10.460: E/AndroidRuntime(19711):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2074)
07-24 12:39:10.460: E/AndroidRuntime(19711):    ... 11 more

这是我的解析器

    public class BackgroundTask extends AsyncTask<String, Void, JSONObject> {

    static InputStream is = null;
    static JSONObject jObj = null;
    static String json = "";

    // variables passed in:
    String url;
    String method;
    List<NameValuePair> params;

    // constructor
    public BackgroundTask(String url, String method, 
        List<NameValuePair> params) {
        this.url = url;
        this.method = method;
        this.params = params;
    }


    @Override
    protected JSONObject doInBackground(String... args) {
        try {
            if(method == "POST"){
                DefaultHttpClient httpClient = new DefaultHttpClient();
                httpClient.getParams().setParameter(ClientPNames.COOKIE_POLICY,
                        CookiePolicy.BROWSER_COMPATIBILITY);
                HttpPost httpPost = new HttpPost(url);
                httpPost.setEntity(new UrlEncodedFormEntity(params));

                HttpResponse httpResponse = httpClient.execute(httpPost);
                HttpEntity httpEntity = httpResponse.getEntity();
                is = httpEntity.getContent();

            } else if(method == "GET"){
                DefaultHttpClient httpClient = new DefaultHttpClient();
                String paramString = URLEncodedUtils.format(params, "utf-8");
                url += "?" + paramString;
                HttpGet httpGet = new HttpGet(url);

                HttpResponse httpResponse = httpClient.execute(httpGet);
                HttpEntity httpEntity = httpResponse.getEntity();
                is = httpEntity.getContent();
            }
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    is, "iso-8859-1"), 8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
            is.close();
            json = sb.toString();
        } catch (Exception e) {
            Log.e("fail!", "Error convert stream to String: " + e.toString());
        }

        try {
            jObj = new JSONObject(json);
        } catch (JSONException e) {
            Log.e("JSON Parser", "Error parsing data " + e.toString());
        }

        return jObj;
    }

    @Override
    protected void onPostExecute(JSONObject obj) {

    }       
}

这是显示列表的活动

    public class JSonResultActivity extends ListActivity {


// déclarer l’URL du fichier employes.json
private static String url = "https://api.foursquare.com/v2/venues/search?ll=40.7,-74&radius=0&client_id=50QO00GZKUPA25PDGO1IY3UHMK3IBEMO2F4CTO5M2DBLVGQD&client_secret=MVJZGC3WT4V55DQPJYBFNZ5X3IACIDLFVM1HKA2WBTEHAXDF&v=20130703";
private static final String TAG_VENUES = "venues";
private static final String TAG_ID = "id";
private static final String TAG_NAME = "name";
private static final String TAG_LOCATION = "location";
private static final String TAG_ADDRESS = "adresse";
private static final String TAG_CROSS_STREET = "crossStreet";
private static final String TAG_CITY = "city";
private static final String TAG_STATE = "state";
private static final String TAG_POSTAL_CODE = "postalCode";
private static final String TAG_COUNTRY = "country";
private static final String TAG_LAT = "lat";
private static final String TAG_LNG = "lng";
private static final String TAG_DISTANCE = "distance";



// initialiser à null notre liste d’employés (de type JSONArray)
JSONArray venues = null;

@Override
public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

// création de la ArrayList qui nous permettra de remplir la listView
ArrayList<HashMap<String, String>> venuesList = new ArrayList<HashMap<String, String>>();

// instancier la classe JsonParser
//JsonParser jParser = new JsonParser ();

BackgroundTask backgroundTask = new BackgroundTask(null, null, null);
backgroundTask.execute(url);

// récupérer le JSONObject à partir de l’url
//JSONObject json = jParser.getJSONFromUrl(url);
JSONObject json = backgroundTask.doInBackground(url);

try {

// récupérer la liste de tous les employés
venues = json.getJSONArray(TAG_VENUES);

// parcourir toute la liste des employés
for(int i = 0; i < venues.length(); i++){

// récupérer un employé de type JSONObject
JSONObject ven = venues.getJSONObject(i);

// stocker chaque item du JSONObject employe dans une variable de type String
String id = ven.getString(TAG_ID);
String name = ven.getString(TAG_NAME);


// récupérer le JSONObject phone qui contient deux items
JSONObject location = ven.getJSONObject(TAG_LOCATION);
String address = location.getString(TAG_ADDRESS);
String crossStreet= location.getString(TAG_CROSS_STREET);
String city= location.getString(TAG_CITY);
String state= location.getString(TAG_STATE);
String postalCode= location.getString(TAG_POSTAL_CODE);
String country= location.getString(TAG_COUNTRY);
String lat= location.getString(TAG_LAT);
String lng= location.getString(TAG_LNG);
String distance= location.getString(TAG_DISTANCE);

// créer une HashMap pour ajouter les informations dans chaque item
HashMap<String, String> map = new HashMap<String, String>();

// insérer dans la HashMap les données que l’on veut afficher sous la forme de clé/valeur
map.put(TAG_ID, id);
map.put(TAG_NAME, name);
map.put(TAG_CITY, city);
map.put(TAG_LAT, lat);
map.put(TAG_LNG, lng);
map.put(TAG_DISTANCE, distance);

// ajouter une HashMap à notre ArrayList
venuesList.add(map);
}

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

//créer un SimpleAdapter qui se chargera de placer les données dans chaque item de notre listView
ListAdapter adapter = new SimpleAdapter(this, venuesList,R.layout.activity_json_result, new String[] { TAG_NAME, TAG_ADDRESS, TAG_LAT, TAG_LNG }, 
        new int[] {R.id.name, R.id.address, R.id.lat, R.id.lng });

// attribuer à notre listView l'adapter que l'on vient de créer
setListAdapter(adapter);
}
}

我该如何解决这个问题?

谢谢您的帮助。

4

0 回答 0