Asynctask与android中的webservices

时间:2012-04-09 14:48:19

标签: android web-services android-asynctask

我需要帮助..我正试图从我的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"}]

任何帮助,请

2 个答案:

答案 0 :(得分:1)

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

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

将此放入onCreate()方法已解决了我的问题。可能它可以帮助你。我还在寻找更多的选择。

答案 1 :(得分:0)

看起来错误在于解析JSON,尽管你没有得到JSONException。