Android 如何在启动新活动时显示ProgressDialog?

Android 如何在启动新活动时显示ProgressDialog?,android,progressdialog,Android,Progressdialog,目标:有一个显示“加载…”的进度对话框,直到下一个活动完全加载并显示在屏幕上 尝试将ProgressDialog上下文和活动设置为原始活动。还尝试了getApplicationContext()和getParentContext()。最后两种方法的例外情况。需要执行此操作,因为目标活动由于非简单布局文件而渲染缓慢。(由于组织问题,目前无法解决此问题。)结果表明,目标活动需要1-2秒才能重新创建,然后屏幕变黑达5秒以上,然后开始绘制。渲染速度很慢。用Hierarchy Viewer查看并看到很多红

目标:有一个显示“加载…”的进度对话框,直到下一个活动完全加载并显示在屏幕上

尝试将ProgressDialog上下文和活动设置为原始活动。还尝试了getApplicationContext()和getParentContext()。最后两种方法的例外情况。需要执行此操作,因为目标活动由于非简单布局文件而渲染缓慢。(由于组织问题,目前无法解决此问题。)结果表明,目标活动需要1-2秒才能重新创建,然后屏幕变黑达5秒以上,然后开始绘制。渲染速度很慢。用Hierarchy Viewer查看并看到很多红色球,但现在无法修复

阅读一些相关的,但还没有找到解决方案。例如

这两个都会崩溃。使用源活动的“this”也不起作用

// Context parentContext = this.getParent().getBaseContext();    
Context parentContext = this.getApplicationContext();
ProgressDialogMenuable theProgressDialog = new ProgressDialogMenuable(parentContext,this);
theProgressDialog.setTitle("yeeha");
theProgressDialog.setMessage("weewah");
theProgressDialog.setIndeterminate(true);
theProgressDialog.setCancelable(true);
theProgressDialog.show();
而且,奇怪的是,当我这样做时,什么也没有发生: progressdialog.show(); ActivityHelper.changeActivity(this,v,insMyHoldingActivity.class,extraMap,-1,-1); 用户单击按钮以显示下一个活动,但ProgressDialog与活动启动冲突,除了按钮在Touch上变为黄色外,实际上什么也没有发生。下面的按钮工作。删除ProgressDialog创建并使其正常工作。没有控制台消息记录。开发人员肯定有点不高兴。

有两种方法

第一种使用异步任务的方法

如果您正在执行繁重的任务,例如从服务器加载数据或解析xml,那么如果您想从ActivityA调用ActivityB,请使用AsynTask

*步骤1*创建一个AsyncTask类。在doBackground()方法中写入所有后台任务,并在任务完成后调用在onPostExecute()PostExecute方法中编写代码的活动

import android.content.Context;
import android.content.Intent;
import android.os.AsyncTask;
import android.view.View;



public class LoadingDataFromServer extends AsyncTask {
    Context currentContext = null;

    boolean isCancelled = false;


    public LoadingDataFromServer(Context context) {
        currentContext = context;

    }

    @Override
    protected void onPreExecute() {
        if (DashboardActivity.progressBarLayout != null) {
            DashboardActivity.progressBarLayout.setVisibility(View.VISIBLE);
            // Log.i(TAG,".....Now make progress bar visible.....");
        }

        super.onPreExecute();
    }

    @Override
    protected Object doInBackground(Object... params) {
        // do background processing

        try {
// do background tasks eg sever communication
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(Object result) {
        // TODO Auto-generated method stub
        // progressDialog.dismiss();

        // call second Activity
        Intent i = new Intent(currentContext, com.ActvityB.class);
        super.onPostExecute(result);
    }

    @Override
    protected void onCancelled() {
        // TODO Auto-generated method stub
        isCancelled = true;
        super.onCancelled();
    }

}
步骤2:在要跳转到新活动(例如在ActivityA中)的activity fro中,调用AsynTask的execute()

new LoadingDataFromServer(context).execute(null);
第二种方法

首先显示进度对话框。 创建一个线程来执行所有后台任务。线程完成任务后,取消进度对话框并调用下一个活动


线程完成任务后,调用下一个活动传递此对象(进度对话框),并在该新活动内关闭此对话框。

您可以显示如下进度对话框-

定义这个

private ProgressDialog pd = null;
在你的活动课上

将其放在onCreate中(不要直接在此处设置ContentView)

//背景举重

class IAmABackgroundTask extends
        AsyncTask<String, Integer, Boolean> {
    @Override
    protected void onPreExecute() {
        // showDialog(AUTHORIZING_DIALOG);
    }

    @Override
    protected void onPostExecute(Boolean result) {

        // Pass the result data back to the main activity
        ActivityName.this.data = result;

        if (ActivityName.this.pd != null) {
            ActivityName.this.pd.dismiss();
        }

        setContentView(R.layout.main);


    }

    @Override
    protected Boolean doInBackground(String... params) {

        //Do all your slow tasks here but dont set anything on UI
                    //ALL ui activities on the main thread 

        return true;

    }

}
类IAmABackgroundTask扩展
异步任务{
@凌驾
受保护的void onPreExecute(){
//showDialog(授权_对话框);
}
@凌驾
受保护的void onPostExecute(布尔结果){
//将结果数据传回主活动
ActivityName.this.data=结果;
if(ActivityName.this.pd!=null){
ActivityName.this.pd.discouse();
}
setContentView(R.layout.main);
}
@凌驾
受保护的布尔doInBackground(字符串…参数){
//在这里执行所有缓慢的任务,但不要在UI上设置任何内容
//主线程上的所有ui活动
返回true;
}
}
还要经历以下过程:http://developer.android.com/training/improving-layouts/index.html 用于优化布局性能。
还可以使用Traceview查找瓶颈

以下是我的代码,可以提供帮助

在本文中,我只介绍了
AsyncTask
的第一种方法,即
onPreExecute

用户\u AsyncTask扩展了AsyncTask:

public class User_AsyncTask extends AsyncTask<String, String, String>
    {
        String response = "";

        @Override
        protected void onPreExecute()
        {
            try
            {
                if (progressDialog != null)
                    progressDialog.cancel();
            }
            catch (Exception e)
            {

            }
            progressDialog = ProgressDialog.show(DisplayDetails.this, "", "Please wait...", true, true);
            progressDialog.setCancelable(false);
            progressDialog.show();
        }
公共类用户\u AsyncTask扩展了AsyncTask
{
字符串响应=”;
@凌驾
受保护的void onPreExecute()
{
尝试
{
如果(progressDialog!=null)
progressDialog.cancel();
}
捕获(例外e)
{
}
progressDialog=progressDialog.show(DisplayDetails.this,“,”请稍候…”,true,true);
progressDialog.setCancelable(假);
progressDialog.show();
}

在新活动中创建一个异步任务,在那里执行所有处理,在执行后设置布局元素。在创建时显示进度条,在执行后关闭。让我试试。在这种情况下,我只能子类化(不更改)目标活动。因此,这可能有效。如果您作为解决方案发布,我将接受。我认为ProgressDialog不能跨越活动的生命周期(多个活动);但是我们可以用这种方法对用户产生影响,活动A中的一个PDlg,然后是活动B中的另一个,正如您所说。我实际上使用了与AsynTask不同的语法,但我相信在语义上是相同的。final Runnable r=new Runnable(){public void run(){setupActivityDisplay();//需要一段时间的东西theProgressDialog.Disease();};(new Handler()).postDelayed(r,1000);更多的研究表明,在活动布局完成之前,无法显示ProgressDialog。简单地说,对于复杂的布局,用户将看到黑色(空白)屏幕显示一段时间。仍在研究中。有一种方法可以显示ProgressDialog。onCreate之后。只需删除布局设置ContentView(从onCreate调用。稍后再执行。接受此答案是最佳方法。实际上,布局渲染步骤是一个黑洞(和黑屏)对于开发人员。我所做的研究中无法显示两个活动之间的进度对话框。类似的问题,也没有人找到方法。和。过程:1-用户触摸,新活动对象2。2-渲染布局5。3-数据检索0。4-UI填充2。在emu中。看起来可以使用ActivityGroup,但这是不推荐的d现在。按照第一张海报告诉我的那样,在异步任务中进行布局渲染。效果很好。这是正确的方法。将缓慢的渲染延迟到以后。必须使用
public class User_AsyncTask extends AsyncTask<String, String, String>
    {
        String response = "";

        @Override
        protected void onPreExecute()
        {
            try
            {
                if (progressDialog != null)
                    progressDialog.cancel();
            }
            catch (Exception e)
            {

            }
            progressDialog = ProgressDialog.show(DisplayDetails.this, "", "Please wait...", true, true);
            progressDialog.setCancelable(false);
            progressDialog.show();
        }