在android中,当连接太慢时,如何创建重新加载按钮
嘿,伙计们,我正在构建一个android应用程序,它使用json从数据库加载数据。当互联网速度很快(3g、4g或wifi)时,它可以加载,但当人们使用2g时,加载应用程序的时间会很长。如何捕获该异常并像playstore那样在等待很长时间后创建重试按钮 我的代码是:在android中,当连接太慢时,如何创建重新加载按钮,android,json,android-listview,progressdialog,Android,Json,Android Listview,Progressdialog,嘿,伙计们,我正在构建一个android应用程序,它使用json从数据库加载数据。当互联网速度很快(3g、4g或wifi)时,它可以加载,但当人们使用2g时,加载应用程序的时间会很长。如何捕获该异常并像playstore那样在等待很长时间后创建重试按钮 我的代码是: @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
@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 });
}
@覆盖
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView=(listView)findViewById(R.id.listView1);
ConnectivityManager cm=(ConnectivityManager)getSystemService(CONNECTIVITY_服务);
NetworkInfo activeNetwork=cm.getActiveNetworkInfo();
布尔网络连接=活动网络!=空
&&activeNetwork.isAvailable();
如果(!网络已连接){
onDetectNetworkState().show();
}否则{
accessWebService();
注册表调用Clickback();
}
}
私有类JsonReadTask扩展了AsyncTask{
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
pDialog=新建进度对话框(MainActivity.this);
pDialog.setTitle(R.string.waiting);
setMessage(getString(R.string.get_));
pDialog.setCancelable(假);
pDialog.show();
}
@凌驾
受保护的字符串doInBackground(字符串…参数){
HttpClient HttpClient=新的DefaultHttpClient();
HttpPost HttpPost=新的HttpPost(参数[0]);
试一试{
HttpResponse response=httpclient.execute(httppost);
jsonResult=inputStreamToString(
response.getEntity().getContent()).toString();
}
捕获(客户端协议例外e){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}
返回null;
}
私有StringBuilder inputStreamToString(InputStream为){
字符串rLine=“”;
StringBuilder answer=新建StringBuilder();
BufferedReader rd=新的BufferedReader(新的InputStreamReader(is));
试一试{
而((rLine=rd.readLine())!=null){
答:追加(rLine);
}
}
捕获(IOE异常){
//e.printStackTrace();
Toast.makeText(getApplicationContext(),
“错误…”+e.toString(),Toast.LENGTH_LONG).show();
}
返回答案;
}
@凌驾
受保护的void onPostExecute(字符串结果){
ListDrwaer();
pDialog.disclose();
}
}//结束异步任务
public void accessWebService(){
JsonReadTask=新建JsonReadTask();
//传递URL字符串数组的值
执行(新字符串[]{url});
}
我检查了网络连接,以了解其是否已连接,但当连接时间过长时,它会崩溃。我如何修复该问题?例如,我希望它等待10-15秒,然后显示重试按钮,以便用户重试
任何帮助都将不胜感激。提前感谢。您可以创建一个类似5000毫秒的计时器,并查看该计时器是否通过doinbackground函数中的return null,同时初始化一个类似于
reload=false的标志代码>。如果计时器具有endreload=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 });
}
@覆盖
受保护的字符串doInBackground(字符串…参数){
布尔重载=假;
long waitTime=5000;//或任何您希望超时长度较长的值
curWaitTime=0;
同时(!重新加载(&curWaitTime)
如何创建计时器??你能更具体一点吗?是的,在你的doInBackground函数中,放一些像long waitTime=5000;//或者,无论您希望超时长度是长的,curWaitTime=0;而(!reload&&curWaitTime