[英]Android application crashing on 3G, slow connection, but works over WIFI
Im optimizing a simple android app that uses HTTP GET calls (with Apache HttpClient) to read data from a web server. 我正在优化一个简单的Android应用程序,该应用程序使用HTTP GET调用(与Apache HttpClient一起)从Web服务器读取数据。 The data that is transferred is in JSON format.
传输的数据为JSON格式。
The application is pretty slow while on WIFI, but everytime the phone switches to 3G the app is getting the URL but it's failing to parse. 使用WIFI时,该应用程序的运行速度非常慢,但是每次手机切换到3G时,该应用程序都会获取URL,但无法解析。
org.json.JSONException: Value <!DOCTYPE of type java.lang.String cannot be converted to JSONObject
Im using AsyncTask to switch on a background thread: 我正在使用AsyncTask打开后台线程:
private class DownloadJSONRepertoire extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
progressBar.setVisibility(View.VISIBLE);
}
@Override
protected Void doInBackground(Void... params) {
arrayList = new ArrayList<HashMap<String, String>>();
jsonObject = JSONfunctions.getJSONfromURL("http://example");
try {
jsonArray = jsonObject.getJSONArray("posts");
for(int i = 0; i< jsonArray.length();i++)
{
HashMap<String,String> map = new HashMap<String,String>();
JSONObject jsonObject1 = jsonArray.getJSONObject(i);
String url = jsonObject1.getString("url");
String title = jsonObject1.getString("title");
String content = jsonObject1.getString("content");
map.put(SHAREURL,url);
map.put(TITLE,title);
map.put(CONTENT,content);
JSONArray jsonArray1 = jsonObject1.getJSONArray("attachments");
for(int j=0;j<jsonArray1.length();j++){
JSONObject jsonObject2 = jsonArray1.getJSONObject(j);
String urlImage = jsonObject2.getString("url");
map.put(URL, urlImage);
arrayList.add(map);
}
}
}
catch (JSONException e){
Log.e("Error", e.getMessage());
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void args){
listView = (ListView) mActivity.findViewById(android.R.id.list);
adapter = new ListViewAdapter(mActivity, arrayList);
setListAdapter(adapter);
adapter.notifyDataSetChanged();
progressBar.setVisibility(View.INVISIBLE);
}
}
JSONfunctions class: JSONfunctions类:
public class JSONfunctions {
public static JSONObject getJSONfromURL(String url) {
InputStream is = null;
String result = "";
JSONObject jArray = null;
// Download JSON data from URL
try {
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(url);
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
is = entity.getContent();
} catch (Exception e) {
Log.e("log_tag", "Failed to connect" + e.toString());
}
// Convert response to string
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();
result = sb.toString();
} catch (Exception e) {
Log.e("log_tag", "Error converting result " + e.toString());
}
try {
jArray = new JSONObject(result);
} catch (JSONException e) {
Log.e("log_tag", "Error parsing data " + e.toString());
}
return jArray;
}
}
you are getting too much data in response so there might be possibility that in slow Internet connection connection get close 您收到的数据过多,因此可能会在Internet连接缓慢的情况下关闭
Either use better Volley or Retrofit 使用更好的Volley或翻新
You can provide your own timeout and provide success and failure callback for network call 您可以提供自己的超时时间,并提供网络呼叫的成功和失败回调
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.