嘿伙计们我正在构建一个Android应用程序,它使用json从数据库加载数据。当互联网速度很快(3g或4g或wifi)时,它加载正常,但当人们使用2g时,加载应用程序崩溃的时间非常长。如何捕获该异常并在等待很长时间之后创建一个像Playstore那样的重试按钮?
我的代码是:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = (ListView) findViewById(R.id.listView1);
ConnectivityManager cm = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
boolean network_connected = activeNetwork != null
&& activeNetwork.isAvailable();
if (!network_connected) {
onDetectNetworkState().show();
} else {
accessWebService();
registerCallClickBack();
}
}
private class JsonReadTask extends AsyncTask<String, Void, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
pDialog = new ProgressDialog(MainActivity.this);
pDialog.setTitle(R.string.waiting);
pDialog.setMessage(getString(R.string.get_stocks));
pDialog.setCancelable(false);
pDialog.show();
}
@Override
protected String doInBackground(String... params) {
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(params[0]);
try {
HttpResponse response = httpclient.execute(httppost);
jsonResult = inputStreamToString(
response.getEntity().getContent()).toString();
}
catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
private StringBuilder inputStreamToString(InputStream is) {
String rLine = "";
StringBuilder answer = new StringBuilder();
BufferedReader rd = new BufferedReader(new InputStreamReader(is));
try {
while ((rLine = rd.readLine()) != null) {
answer.append(rLine);
}
}
catch (IOException e) {
// e.printStackTrace();
Toast.makeText(getApplicationContext(),
"Error..." + e.toString(), Toast.LENGTH_LONG).show();
}
return answer;
}
@Override
protected void onPostExecute(String result) {
ListDrwaer();
pDialog.dismiss();
}
}// end async task
public void accessWebService() {
JsonReadTask task = new JsonReadTask();
// passes values for the urls string array
task.execute(new String[] { url });
}
我检查了网络连接,知道它是否已连接但是当它连接很长时间时崩溃我怎么能解决这个问题?例如我希望它等待10-15秒然后重试按钮显示,以便用户重试。
任何帮助都将受到高度赞赏。提前谢谢。
答案 0 :(得分:1)
你可以制作一个5000毫秒的定时器,看看你的doInBackgroundFunction中是否传递了这个定时器返回null,也初始化了一个像reload = false;
这样的标志。如果计时器结束reload = true;
在你的onPostExecute检查中
if(reload)
{new JsonReadTask().execute(); }
在这里编辑
@Override
protected String doInBackground(String... params) {
boolean reload =false;
long waitTime = 5000;// or whatever you want the timeout length to be long
curWaitTime = 0;
while (!reload && curWaitTime < waitTime)
HttpResponse response;
{ // put your network
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(params[0]);
try {
response = httpclient.execute(httppost);
jsonResult = inputStreamToString(
response.getEntity().getContent()).toString();
//test if jsonResult have the correct data if yes reload=true;
}
catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
curWaitTime += 100;
}
return null;
}
private StringBuilder inputStreamToString(InputStream is) {
String rLine = "";
StringBuilder answer = new StringBuilder();
BufferedReader rd = new BufferedReader(new InputStreamReader(is));
try {
while ((rLine = rd.readLine()) != null) {
answer.append(rLine);
}
}
catch (IOException e) {
// e.printStackTrace();
Toast.makeText(getApplicationContext(),
"Error..." + e.toString(), Toast.LENGTH_LONG).show();
}
return answer;
}
@Override
protected void onPostExecute(String result) {
ListDrwaer();
pDialog.dismiss();
if(!reload){
accessWebService();
}
}
}// end async task
public void accessWebService() {
JsonReadTask task = new JsonReadTask();
// passes values for the urls string array
task.execute(new String[] { url });
}