0

我需要帮助..我正在尝试从我的 android 客户端应用程序调用 php webservices,我无法从主线程调用它,因为 SDK 是 15,我在网上搜索,我发现这个问题的解决方案是使用 Asynktask .. 但它对我不起作用我不知道为什么.. 请帮助..谢谢

public class CustomWebConnection extends AsyncTask<Void, Void, String> {
private final String                 uri = "http://localhost/mywebservices.php?op=GetAllRest";
private ArrayList<NameValuePair>     mParams;
private OnPostExecuteListener        mPostExecuteListener = null;

public static interface OnPostExecuteListener{
    void onPostExecute(String result);
}

CustomWebConnection(ArrayList<NameValuePair> nameValuePairs,
    OnPostExecuteListener postExecuteListener) throws Exception {

    mParams = nameValuePairs;
    mPostExecuteListener = postExecuteListener;
    if (mPostExecuteListener == null)
        throw new Exception("Param cannot be null.");
}

@Override
protected String doInBackground(Void... params) {

      JSONObject param=null;
      String result = null;
      HttpClient httpClient = new DefaultHttpClient();
        HttpHost httpHost = new HttpHost("localhost",80);  
        HttpPost httpPost = new HttpPost(uri);
        httpPost.addHeader("Content-Type", "application/json; charset=utf-8");


        try
        {
            //HttpEntity bodyEntity = new StringEntity(param.toString(), "utf8");
            //httpPost.setEntity(bodyEntity);
            HttpResponse response = httpClient.execute(httpPost);
            HttpEntity entity = response.getEntity();

            if (entity != null) {
                InputStream instream = entity.getContent();
                BufferedReader reader = new BufferedReader(
                     new InputStreamReader(instream));
                StringBuilder sb = new StringBuilder();


                String line = null;
                while ((line = reader.readLine()) != null)
                    sb.append(line + "\n");


                result = sb.toString();
                instream.close();           
            }
        }

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


    httpPost.abort();
    return result ;
}

@Override
protected void onPostExecute(String result) {
    if (mPostExecuteListener != null){
        try {
            JSONObject json = new JSONObject(result);
            mPostExecuteListener.onPostExecute(result);
        } catch (JSONException e){
            e.printStackTrace();
        }
    }
} 

它抛出了这个异常

     04-09 16:31:37.393: E/AndroidRuntime(2284): FATAL EXCEPTION: main
     04-09 16:31:37.393: E/AndroidRuntime(2284): java.lang.NullPointerException
      04-09 16:31:37.393: E/AndroidRuntime(2284):   at    org.json.JSONTokener.nextCleanInternal(JSONTokener.java:116)
     04-09 16:31:37.393: E/AndroidRuntime(2284):    at  org.json.JSONTokener.nextValue(JSONTokener.java:94)
      04-09 16:31:37.393: E/AndroidRuntime(2284):   at org.json.JSONObject.<init>(JSONObject.java:154)
     04-09 16:31:37.393: E/AndroidRuntime(2284):    at org.json.JSONObject.<init>(JSONObject.java:171)
  04-09 16:31:37.393: E/AndroidRuntime(2284):   at  com.vtab.CustomWebConnection.onPostExecute(CustomWebConnection.java:92)
 04-09 16:31:37.393: E/AndroidRuntime(2284):    at com.vtab.CustomWebConnection.onPostExecute(CustomWebConnection.java:1)
 04-09 16:31:37.393: E/AndroidRuntime(2284):    at  android.os.AsyncTask.finish(AsyncTask.java:602)
 04-09 16:31:37.393: E/AndroidRuntime(2284):    at android.os.AsyncTask.access$600(AsyncTask.java:156)
 04-09 16:31:37.393: E/AndroidRuntime(2284):    at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:615)
 04-09 16:31:37.393: E/AndroidRuntime(2284):    at android.os.Handler.dispatchMessage(Handler.java:99)
 04-09 16:31:37.393: E/AndroidRuntime(2284):    at android.os.Looper.loop(Looper.java:137)
  04-09 16:31:37.393: E/AndroidRuntime(2284):   at android.app.ActivityThread.main(ActivityThread.java:4424)
  04-09 16:31:37.393: E/AndroidRuntime(2284):   at java.lang.reflect.Method.invokeNative(Native Method)
  04-09 16:31:37.393: E/AndroidRuntime(2284):   at java.lang.reflect.Method.invoke(Method.java:511)
  04-09 16:31:37.393: E/AndroidRuntime(2284):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
  04-09 16:31:37.393: E/AndroidRuntime(2284):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
 04-09 16:31:37.393: E/AndroidRuntime(2284):    at dalvik.system.NativeStart.main(Native Method)

错误在HttpResponse response = httpClient.execute(httpPost);

这是来自服务器的JSON 响应

[{"rest_id":"1","rest_name":"Al Dabke","cuisine":"Lebanese","no_tables":"15","bg_img":"lebanon","rest_logo":"dabke"},{"rest_id":"4","rest_name":"MY KIND OF PLACE","cuisine":null,"no_tables":"10","bg_img":"kindofplacebg","rest_logo":"mykindofplacelogo"},{"rest_id":"5","rest_name":"LANTANIA","cuisine":"Thai","no_tables":"10","bg_img":"lantaniabg","rest_logo":"lantanialogo"},{"rest_id":"6","rest_name":"LEONARDO","cuisine":"italian","no_tables":"10","bg_img":"leonardobg","rest_logo":"leonardologo"},{"rest_id":"7","rest_name":"LE MARCHE ","cuisine":"French","no_tables":"10","bg_img":"lemarchebg","rest_logo":"lemarchelogo"},{"rest_id":"8","rest_name":"Marias","cuisine":"mexican","no_tables":"10","bg_img":"mariang","rest_logo":"marialogo"},{"rest_id":"9","rest_name":"NOBLE HOUSE","cuisine":"chinese","no_tables":"10","bg_img":"noblehousebg","rest_logo":"noblehouselogo"}]

请有任何帮助

4

2 回答 2

1

我最近也遇到了这个问题,我发现 HttpClient 是 Android ICS 中的问题,我使用的简单技巧是将最小 SDK 版本从 15 更改为 7。但这不是一个合适的解决方案。我从博客中看到代码

StrictMode.ThreadPolicy policy = new StrictMode.
ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);

把它放在 onCreate() 方法中解决了我的问题。也许它可以帮助你。我仍在寻找更多选择。

于 2012-04-09T15:36:27.923 回答
0

看起来错误是在解析 JSON 时出现的,尽管您没有收到 JSONException。

于 2012-04-09T14:54:30.857 回答