Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/212.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在后台从Internet获取数据并显示ProgressDialog或ProgressBar_Android - Fatal编程技术网

Android 在后台从Internet获取数据并显示ProgressDialog或ProgressBar

Android 在后台从Internet获取数据并显示ProgressDialog或ProgressBar,android,Android,我正在开发一个应用程序,需要访问一个网站 数据,并将在设备上显示该数据。我想从中获取数据 在后台使用Internet并在屏幕上显示ProgressDialog或ProgressBar 设备和应用程序从服务器接收响应时,应用程序将 关闭对话框或栏并显示数据 为此,我使用AsyncTask- AsyncTask的代码如下-- 并按如下方式调用此代码-- //对响应执行操作 但是ProgressDialog没有显示。(我想原因是 线程未完成,只有当线程已完成时,android才会失效 已完成) 我的问

我正在开发一个应用程序,需要访问一个网站 数据,并将在设备上显示该数据。我想从中获取数据 在后台使用Internet并在屏幕上显示ProgressDialog或ProgressBar 设备和应用程序从服务器接收响应时,应用程序将 关闭对话框或栏并显示数据

为此,我使用AsyncTask-

AsyncTask的代码如下--

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

//对响应执行操作

但是ProgressDialog没有显示。(我想原因是 线程未完成,只有当线程已完成时,android才会失效 已完成)

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


感谢

以下是在后台执行任务时显示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();
                }
}
类GetTask扩展了异步任务
{
语境;
ProgressDialog mDialog=null;
GetPhotoFeedTask(上下文)
{
mContext=上下文;
}
@凌驾
受保护的void onPreExecute()
{
super.onPreExecute();
mDialog=新建进度对话框(mContext);
设置消息(“请稍候…”);
mDialog.show();
}
@凌驾
受保护的字符串doInBackground(对象…参数)
{
//在后台执行任务:获取响应
}
@凌驾
受保护的void onPostExecute(字符串结果)
{
super.onPostExecute(结果);
SetProgressBarInDeterminateVibility(假);
//mDialog.discouse();
}
}
您可以使用
newgettask(this.execute()
语句从活动中调用它


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

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

嗨,萨缪,谢谢你的回复。但我使用的代码几乎相同。我的问题是,如果调用GetTask(this).execute()的活动尚未完成,则意味着它正在使用以下代码等待响应--response=serverTaskObject.get();此时将不显示“进度”对话框。我认为这是因为ui线程(调用活动正在其中运行)尚未完成,android只有在线程完成时才会失效。我的问题——1——如果我的猜测是正确的?如果是,我应该如何实施?2-如果有其他更好的方法,我不确定我是否理解你的问题;假设在onCreate()中有几个stmt,其中一个恰好是GetTask(this.execute()。onCreate()stmts在UI线程上运行。AsyncTask创建一个单独的线程,但onPreExecute()和onPostExecute()方法具有UI线程的句柄,因此可以更新UI。JVM将在onCreate中执行语句,当它遇到GetTask(this).execute()时,它将启动一个新线程,并在onCreate中继续执行下一个语句(这取决于JVM不保证)。无论何时调用onPreExecute(),都会显示ProgressDialog。请看以下内容:嗨,为了澄清我的问题,如果在onCreate()中,GetTask(this).execute()是屏幕上出现Progress Dialog之后的最后一条语句,但是如果在该语句之后有response=GetTaskObject.get()之类的语句;[AsyncTask类的此方法等待doInBackground()的完成并返回结果。]可能是其他一些用于处理来自服务器的响应的语句,进度对话框不会出现。现在,同样的假设是,在UI线程完成之前,android不会使视图无效,并且。。。。。。。。现在如果我的问题清楚了?谢谢
ServerTask serverTaskObject = new ServerTask();
serverTaskObject.execute();
HttpResponse response = serverTaskObject.get();
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();
                }
}