在Android中连接速度太慢时如何创建重新加载按钮

科斯塔斯·德拉克(Kostas Drak)

大家好,我正在构建一个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秒,然后显示一个重试按钮,因此用户重试。

任何帮助将不胜感激。提前致谢。

卢西恩·钱

您可以将计时器设置为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 });
    }

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Android:片段加载速度太慢

单击按钮时如何重新加载页面?

单击按钮时如何在 URL 中添加值而不重新加载/重新定位页面

在Android中重新加载活动时,如何修复ArrayIndexOutOfBoundsException?

使用内联时,管理页面的加载速度太慢

加载大数据时,垫自动完成速度太慢

LeafLet JS Map中的大型JSON URL加载速度太慢

在Android中按下按钮时如何创建弹出窗口?

按下按钮时如何重新加载 jQuery 元素

按下asp按钮时如何停止重新加载页面?

处理后退按钮而无需在Android中重新加载片段

应用加载时连接速度非常慢

html中的重新加载按钮

创建React App时不要在Express中重新加载

如何在Angularjs中重新加载页面Onclick的“提交”按钮?

Android-滚动时如何在Recyclerview中停止图像重新加载

如何在Android中创建浏览按钮以从SD卡加载任何图像

没有页面加载时如何创建按钮事件发生?

如何在php中单击删除按钮时重新加载同一页面-Moodle

为FileExplorerApplication创建一棵树,但加载速度太慢:<(JAVA,NETBEAN,JTREE,FILE Explorer)

从保管箱帐户提供图像时,页面加载速度太慢

添加图片时,应用加载速度太慢

jQuery的src attr()用法加载速度太慢

使用Dataflow的Bigtable批量加载速度太慢

ng-serv加载速度太慢

创建成功后如何重新加载列表中的数据?

如何在JQuery中创建动画后调用重新加载

如何创建一个加载网页的android按钮?

重新加载后,UITableViewCell 中的按钮不会保持连接到初始单元格