【问题标题】:How to prevent a ProgressBar from sticking?如何防止 ProgressBar 卡住?
【发布时间】:2018-05-31 12:31:51
【问题描述】:

在我的应用程序中,我通过 ion 库从网站获取了一些 TEXT,我正在使用 progressBar 来显示下载该数据的进度。

但我的主要问题是,在onComplete 中,我实现了一些与TEXT 一起使用的方法,我从网站上获得了这些是一些循环方法,它们使用了很多 for 和其他东西,实际上是我的progressBar一开始可以正常工作,但是当它完成下载数据时,progressBar 会一直保持到onComplete() 中的所有方法都完成。

我希望progressBar 无论如何都会运行,并且如果不从onComplete() 中删除方法就不会卡住,这可能吗?

这是我使用在onClick() 事件中调用的离子库的函数:

private void getHTML(){
    progressDialog = new SpotsDialog(MainActivity.this, R.style.Custom);
    progressDialog.show();
    Ion.with(getApplicationContext())
            .load("IP")
            .asString()
            .setCallback(new FutureCallback<String>() {
                @SuppressLint("SetTextI18n")
                @Override
                public void onCompleted(Exception e, String result) {
                    htmlresultart = result;
                    htmlresultart = htmlresultart.replace("</td>", "\n");
                    getTable();
                    getHeader();
                    getBody();
                    progressDialog.cancel();
                }
            });

}

【问题讨论】:

    标签: android progress-bar android-ion


    【解决方案1】:

    如果在 onCompleted() 回调中调用的方法执行时间过长,那么它们需要在后台线程上运行。在这种情况下,对 Ion 使用回调是没有意义的,相反,您应该同步获取数据,然后在单个后台线程上执行所有其他任务,如下所示:

    private void getHTML(){
        progressDialog = new SpotsDialog(MainActivity.this, R.style.Custom);
        progressDialog.show();
        // start a background thread
        ExecutorService executor = Executors.newSingleThreadExecutor();
        executor.execute(new Runnable() {
             @Override
             public void run() {
                String htmlresultart = null;
                try {  
                     String htmlresultart = Ion.with(getApplicationContext())
                       .load("IP")
                       .asString()
                       .get(); 
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (ExecutionException e) {
                    e.printStackTrace();
                }
                // if htmlresultart is null at this point, an exception occured and the string couldn't be fetched so you most likely should abort the following processing.
                if (htmlresultart != null) {
                    htmlresultart = htmlresultart.replace("</td>", "\n");
                    getTable();
                    getHeader();
                    getBody();
                    progressDialog.cancel();
                }
             }
        });        
    }
    

    【讨论】:

    • 其实在.get(); Android Studio 说未处理的异常,我该如何解决?它还建议用 try catch 包围我应该尝试一下吗?
    • @I.Mytyuk 该 get() 方法被声明为在某些情况下抛出这些异常。您需要用 try/catch 块包装它或使 getHTML() 也抛出这些异常。检查我所做的编辑。
    • @I.Mytyuk 在调用 getHTML() 后,你是在完成还是从 MainActivity 转到另一个活动?
    • 好吧,实际上你更新的答案不会再崩溃了,但它的 progressAlert 并没有停止,它似乎甚至没有执行 getTable() 和其他方法
    • 不,实际上我只是通过转换从 ion 获得的数据来填充 getBody 中的数据库,因此通过单击按钮我调用 getHTML 方法
    猜你喜欢
    • 2019-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-04
    • 1970-01-01
    相关资源
    最近更新 更多