2012-07-10 40 views
0

现在我在这里面临一个问题,基本数据 查询一个休息服务,他发送了一个json字符串,提供了30,000个字符。 查询将在3g网络中进行 现在遇到大约4000个字符后出现字符串停顿的问题,我不知道其余的位置。json字符串不是一个完整的传输

RestClient.java

public class RestClient { 

private ArrayList <NameValuePair> params; 
private ArrayList <NameValuePair> headers; 

private String url; 

private int responseCode; 
private String message; 

private String response; 

public String getResponse() { 
    return response; 
} 

public String getErrorMessage() { 
    return message; 
} 

public int getResponseCode() { 
    return responseCode; 
} 

public RestClient(String url) 
{ 
    this.url = url; 
    params = new ArrayList<NameValuePair>(); 
    headers = new ArrayList<NameValuePair>(); 
} 

public void AddParam(String name, String value) 
{ 
    params.add(new BasicNameValuePair(name, value)); 
} 

public void AddHeader(String name, String value) 
{ 
    headers.add(new BasicNameValuePair(name, value)); 
} 

public void Execute(RequestMethod method) throws Exception 
{ 
    switch(method) { 
     case GET: 
     { 
      //add parameters 
      String combinedParams = ""; 
      if(!params.isEmpty()){ 
       combinedParams += "?"; 
       for(NameValuePair p : params) 
       { 
        String paramString = p.getName() + "=" + URLEncoder.encode(p.getValue(),"UTF-8"); 
        if(combinedParams.length() > 1) 
        { 
         combinedParams += "&" + paramString; 
        } 
        else 
        { 
         combinedParams += paramString; 
        } 
       } 
      } 

      HttpGet request = new HttpGet(url + combinedParams); 

      //add headers 
      for(NameValuePair h : headers) 
      { 
       request.addHeader(h.getName(), h.getValue()); 
      } 

      executeRequest(request, url); 
      break; 
     } 
     case POST: 
     { 
      HttpPost request = new HttpPost(url); 

      //add headers 
      for(NameValuePair h : headers) 
      { 
       request.addHeader(h.getName(), h.getValue()); 
      } 

      if(!params.isEmpty()){ 
       request.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8)); 
      } 

      executeRequest(request, url); 
      break; 
     } 
    } 
} 

private void executeRequest(HttpUriRequest request, String url) 
{ 
    request.setHeader("Authorization", "Basic sssss"); 
    HttpClient client = new DefaultHttpClient(); 
    HttpResponse httpResponse; 

    try { 
     httpResponse = client.execute(request); 

     responseCode = httpResponse.getStatusLine().getStatusCode(); 
     message = httpResponse.getStatusLine().getReasonPhrase(); 

     HttpEntity entity = httpResponse.getEntity(); 

     if (entity != null) { 

      InputStream instream = entity.getContent(); 
      response = convertStreamToString(instream); 

      // Closing the input stream will trigger connection release 
      instream.close(); 
     } 

    } catch (ClientProtocolException e) { 
     client.getConnectionManager().shutdown(); 
     e.printStackTrace(); 
    } catch (IOException e) { 
     client.getConnectionManager().shutdown(); 
     e.printStackTrace(); 
    } 
} 

private static String convertStreamToString(InputStream is) { 

    BufferedReader reader = new BufferedReader(new InputStreamReader(is),8 * 1024); 
    StringBuilder sb = new StringBuilder(); 

    String line = null; 
    try { 
     while ((line = reader.readLine()) != null) { 
      sb.append(line + "\n"); 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     try { 
      is.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
    return sb.toString(); 
} 

Aktivity类

ConnectivityManager connMgr = (ConnectivityManager) 
       getSystemService(Context.CONNECTIVITY_SERVICE); 
      NetworkInfo networkInfo = connMgr.getActiveNetworkInfo(); 
      if (networkInfo != null && networkInfo.isConnected()) { 
       // fetch data 

      execute = new Netzwerk().execute("https://....."); 
      try { 
       String t = execute.get().toString(); 
        Log.d("MyTag", "Response: " + t); 


      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (ExecutionException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

     } else { 
      // display error 
     } 

Netzwerk.java

public class Netzwerk extends AsyncTask { 
    @Override 
protected Object doInBackground(Object... arg0) { 
      RestClient rest = new RestClient(arg0[0].toString()); 
      try { 
       rest.Execute(RequestMethod.GET); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      System.out.println(rest.getResponse()); 
      Log.d("MyTag", "getResponse: " + rest.getResponse()); 
      Log.d("MyTag", "getResponseCode: " + rest.getResponseCode()); 
    return rest.getResponse(); 
} 

public String httpAuthentication(String user, String password) { 

    String auth=null; 
    try { 
     auth = android.util.Base64.encodeToString(
       (user + ":" + password).getBytes("UTF-8"), 
       android.util.Base64.NO_WRAP); 
    } catch (UnsupportedEncodingException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    Log.d("MyTag", "Base64 encoded auth string: " + auth); 
    return auth; 
}} 
+0

你将会传送30,000个字符......相当频繁吗?哇.. – TheZ 2012-07-10 07:38:13

+0

听起来像你应该做一些主要的缓存。 – ninetwozero 2012-07-10 07:44:04

+0

我打电话给服务不经常 – Drawlix 2012-07-10 08:01:15

回答

0

我想你应该使用AsyncTask类来处理这种长时间的处理。

+0

我从AsyncTask调用此类 – Drawlix 2012-07-10 07:59:22

+0

你在execute()之后使用了asyncTask对象的get方法吗? – jeremw 2012-07-10 08:06:46

+0

是的,我打电话给asyncTask,并通过tost显示结果与asyncTask的方法 – Drawlix 2012-07-10 08:13:34