2012-12-21 74 views
1

我遇到Android HttpPost请求问题。这样的代码:关于Android HttpPost请求

@Override 
public void onClick(View v) { 

       NameValuePair nameValuePair1 = new BasicNameValuePair("name", "zhangsan"); 
       NameValuePair nameValuePair2 = new BasicNameValuePair("age", "18"); 
       List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 
       nameValuePairs.add(nameValuePair1); 
       nameValuePairs.add(nameValuePair2); 

       try { 
        HttpEntity requestHttpEntity = new UrlEncodedFormEntity(nameValuePairs,HTTP.UTF_8); 
        HttpPost httpPost = new HttpPost("http://www.*.cn/test.aspx"); 
        httpPost.setEntity(requestHttpEntity); 
        HttpClient httpClient = new DefaultHttpClient(); 

        //Using the Http client sends request object 
        try { 
         System.out.println("1111111111111"); 
         httpResponse = httpClient.execute(httpPost); 
         System.out.println("2222222222222"); 
         httpEntity = httpResponse.getEntity(); 
         System.out.println("33333333333333"); 
         System.out.println(EntityUtils.toString(httpResponse.getEntity())); 
         System.out.println("44444444444444"); 
        } catch (Exception e) { 
         e.printStackTrace(); 
        } 
       } catch (UnsupportedEncodingException e) { 
        e.printStackTrace(); 
       } 

      } 

只要通过考试,该程序可以运行在了Android2.3和模拟器无problemly,最终得到正确的输出。

它运行上的Android2.1和模拟器或Android2.2的将在以下位置stucked。

System.out.println (EntityUtils.toString (httpResponse.getEntity())); 

等待很长一段时间,它occasionaliy弹出的应用程序的提示是无响应,偶尔出现的"44444444444444"输出。但是没有在正常情况下得到的功能"System.out.println (EntityUtils.toString (httpResponse.getEntity()));"的输出。

所以,我没有分别Android2.2的手机上的几个测试与仿真器和Android2.1的手机模拟器。

测试一:

我改变http://www.*.cn/test.aspxhttp://www.google.com,并正确运行。

测试二:

我注释掉的"httpPost.setEntity (requestHttpEntity); "行,然后请求的URL没有TNE代码的请求参数。它运行正常。

请给我一个建议,谢谢!

回答

1

您需要在单独的线程中编写HttpPost。如果用户点击,它会冻结用户界面。请找到示例代码做一个HttpPost。

public class ConnectionManager{ 
    private Context context; 

    public ConnectionManager(Context ctx){ 
     this.context = ctx; 
    } 

    public boolean networkInfo(){ 
     ConnectivityManager connMgr = (ConnectivityManager)this.context.getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo networkInfo = connMgr.getActiveNetworkInfo(); 
     if (networkInfo != null && networkInfo.isConnected()) { 
      return true; 
     } else { 
      return false; 
     } 
    } 

    public void showAlert(String title,String message){ 
     AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(
       this.context); 

     // set title 
     alertDialogBuilder.setTitle(title); 

     // set dialog message 
     alertDialogBuilder 
     .setMessage(message) 
     .setCancelable(false) 
     .setNegativeButton("OK",new DialogInterface.OnClickListener() { 
      public void onClick(DialogInterface dialog,int id) { 
       // if this button is clicked, just close 
       // the dialog box and do nothing 
       dialog.cancel(); 
      } 
     }); 

     // create alert dialog 
     AlertDialog alertDialog = alertDialogBuilder.create(); 

     // show it 
     alertDialog.show(); 

    } 
    public String execute_get(String url) { 
     // TODO Auto-generated method stub 
     HttpResponse response = null; 
     String str_response = "";    

     if(networkInfo()){ 
      DefaultHttpClient httpsClient = getHTTPSClient(); 

      try { 
       HttpGet httpget = new HttpGet(url); 
       response = httpsClient.execute(httpget); 
       if (response != null) { 
        str_response = EntityUtils.toString(response.getEntity()); 
        Log.d("Connection Manager","Response: "+str_response); 
       } 
      }catch(Exception e){ 
       e.printStackTrace(); 
      } 
     }else{ 
      showAlert("Connection Error","Please connect to wifi/3g to continue"); 
     } 

     return str_response; 
    } 

    public DefaultHttpClient getHTTPSClient() { 
     SchemeRegistry schemeRegistry = new SchemeRegistry(); 
     schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); 

     HttpParams params = new BasicHttpParams(); 
     params.setParameter(ConnManagerPNames.MAX_TOTAL_CONNECTIONS, 30); 
     params.setParameter(ConnManagerPNames.MAX_CONNECTIONS_PER_ROUTE, new ConnPerRouteBean(30)); 
     params.setParameter(HttpProtocolParams.USE_EXPECT_CONTINUE, false); 
     HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); 

     ClientConnectionManager cm = new SingleClientConnManager(params, schemeRegistry); 
     DefaultHttpClient httpsClient= new DefaultHttpClient(cm, params); 
     return httpsClient; 
    } 

    public String execute_post(String url,String request){ 
     HttpResponse response = null; 
     String str_response = "";    
     if(networkInfo()){ 
      DefaultHttpClient httpsClient = getHTTPSClient(); 

      try { 
       HttpPost httppost = new HttpPost(url); 

       List<BasicNameValuePair> nameValuePairs = new ArrayList<BasicNameValuePair>(2); 
       nameValuePairs.add(new BasicNameValuePair("jsonData", request)); 
       httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
       response = httpsClient.execute(httppost); 

       if (response != null) { 
        str_response = EntityUtils.toString(response.getEntity()); 
        Log.d("ConnectionManager", "Response: "+str_response); 
       } 
      }catch(Exception e){ 
       e.printStackTrace(); 
      } 
     }else{ 
      showAlert("Connection Error","Please connect to wifi/3g to continue"); 
     } 
     return str_response; 
    } 


} 


// Use the above like this 

           new Thread() { 
        @Override 
        public void run() { 
         try { 
          String input = "Your post data" 
          Log.d("POSTDATA",input); 
          String response = execute_post(URLS.LOGIN_AUTH,input); 

          Message responseMsg = new Message(); 
          Bundle b = new Bundle(); 
          b.putString("response", response); 
          responseMsg.setData(b); 

          handler.sendMessage(responseMsg); 
         }catch(Exception e){ 

         } 
        } 
       }.start(); 
1

移动代码,以异步任务可以使用这些链接,执行你的任务。检查here,here,here,here