【问题标题】:Fetching data from Internet in background and showing ProgressDialog or ProgressBar在后台从 Internet 获取数据并显示 ProgressDialog 或 ProgressBar
【发布时间】:2010-01-21 13:46:52
【问题描述】:

我正在开发一个需要访问网站的应用程序 数据,并将在设备上显示该数据。我想从中获取数据 互联网在后台并显示 ProgressDialog 或 ProgressBar 设备,当应用程序收到来自服务器应用程序的响应时 关闭对话框或栏并显示数据。

为此,我正在使用 AsyncTask -

AsyncTask 的代码如下--

ServerTask extends AsyncTask {
        @Override
        protected void onPreExecute() {
                dialogAccessingServer = new ProgressDialog(ctx);
                dialogAccessingServer.setMessage(shownOnProgressDialog);
                dialogAccessingSpurstone.show();
        }

        @Override
        protected ServerResponse doInBackground(String... urlArray) {

                String urlString = urlArray[0];
                HttpResponse serverResponseObject = null;

                //finding HttpResponse

                return serverResponseObject;

        }//end of doInBackground

        @Override
        protected void onPostExecute(HttpResponse serverResponseObject){
                dialogAccessingSpurstone.dismiss();

        }

}

并按如下方式调用此代码--

ServerTask serverTaskObject = new ServerTask();
serverTaskObject.execute();
HttpResponse response = serverTaskObject.get();

//对响应执行操作

但没有显示 ProgressDialog。(我猜它的原因是 线程不完整,只有当线程有 完成)。

我的问题 -- 1-如果我的猜测是正确的?如果是,那么我应该如何实施它? 2- 如果有其他更好的方法来做到这一点?

谢谢

【问题讨论】:

    标签: android


    【解决方案1】:

    以下是在后台执行任务时显示 ProgressDialog 的模板代码:

    class GetTask extends AsyncTask<Object, Void, String>
        {
            Context mContext;
                ProgressDialog mDialog = null;
    
                GetPhotoFeedTask(Context context)
        {
            mContext = context;
        }
    
            @Override
            protected void onPreExecute()
            {
                super.onPreExecute();
    
                 mDialog = new ProgressDialog(mContext);
                 mDialog.setMessage("Please wait...");
                 mDialog.show();
            }
                    @Override
            protected String doInBackground(Object... params)
            {
                      // do stuff in background : fetch response
                    }
    
                    @Override
            protected void onPostExecute(String result)
            {
                super.onPostExecute(result);
                setProgressBarIndeterminateVisibility(false);
                // mDialog.dismiss();
                    }
    }
    

    然后您使用new GetTask(this).execute() 语句从您的活动中调用它;

    注意:注意在显示ProgressDialog 时,如果用户切换方向或导致随后发生的事件,代码可能会中断。建议在此类情况下使用托管对话框。

    【讨论】:

    • 嗨 Samuh,感谢您的回复。但是这段代码几乎相同,我正在使用。我的问题是,如果我从中调用 GetTask(this).execute() 的活动尚未完成,则意味着它正在等待此代码的响应—— response = serverTaskObject.get();然后不会出现进度对话框。我认为其原因是ui线程(其中正在运行调用活动)尚未完成,并且android仅在线程完成时才无效。我的问题 - 1- 如果我的猜测是正确的?如果是,那么我应该如何实施它? 2-如果有其他更好的方法来做到这一点?
    • 我不确定我是否理解您的问题;假设在你的 onCreate() 中你有几个 stmts,其中一个恰好是 GetTask(this).execute()。 onCreate() stmts 在 UI 线程上运行。 AsyncTask 创建一个单独的线程,但 onPreExecute() 和 onPostExecute() 方法具有 UI 线程的句柄,因此可以更新 UI。 JVM 将在您的 onCreate 中执行语句,当它遇到 GetTask(this).execute() 时,它将启动一个新线程并继续执行 onCreate 中的下一条语句(这取决于 JVM,不保证)。每当调用 onPreExecute() 时,都会显示 ProgressDialog。
    • 嗨,澄清我的问题,如果在 onCreate() 中,GetTask(this).execute() 是最后一个语句,而不是进度对话框出现在屏幕上,但如果在此语句之后有类似的语句响应 = GetTaskObject.get(); [AsyncTask 类的这个方法等待 doInBackground() 完成并返回结果。] 并且可能是一些其他处理来自服务器的响应的语句,没有出现 Progress Dialog。现在同样的假设是,在 UI 线程完成之前,android 不会使视图无效,并且......现在如果我的问题很清楚?谢谢
    【解决方案2】:

    如果 UI 线程上有一些待处理的工作“进度对话框”将不会出现,因此 dialog.show() 应该是 UI 线程的最后一行,任何进一步的工作都应该在 onPostExecute() 方法中完成。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-30
      • 2015-11-13
      • 1970-01-01
      • 2014-06-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多