在android中,当连接太慢时,如何创建重新加载按钮

在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);

嘿,伙计们,我正在构建一个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 });
    }
@覆盖
创建时受保护的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的标志。如果计时器具有end
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 });
    }
@覆盖
受保护的字符串doInBackground(字符串…参数){
布尔重载=假;
long waitTime=5000;//或任何您希望超时长度较长的值
curWaitTime=0;
同时(!重新加载(&curWaitTime)
如何创建计时器??你能更具体一点吗?是的,在你的doInBackground函数中,放一些像long waitTime=5000;//或者,无论您希望超时长度是长的,curWaitTime=0;而(!reload&&curWaitTime