【问题标题】:Progress Dialog Freezes while switching to another activity进度对话框在切换到另一个活动时冻结
【发布时间】:2012-11-16 07:54:51
【问题描述】:

我有两个活动。当按意图切换到第二个活动时,它需要 3-4 秒,因为它有很多组件,适配器从 SQLite 等获取数据。因此,我想在切换时显示一个进度对话框。

为此我一直在挖掘主题并尝试了其中的许多:

1-) 在第二个活动上使用 AsyncTask。一旦我单击一个组件切换到第二个活动,它就不会显示进度对话框。它等待 3-4 秒,然后显示进度对话框不到一秒,这不是用户友好的方式。

2-) 在第一个活动上使用 AsyncTask。只要我单击该组件,它就会显示,但进度轮不旋转。进度对话框冻结。

3-) 在第二个活动上使用 AsyncTask onStart() 方法。这是第一种方式。

下面的代码实现了上面的第二种方式,在第一个活动上使用 AsyncTask。

public void toVisitRegister(Event event) { //Switching to the second activity
    new startingThread().execute();
    Intent toVisitRegister = new Intent(MainCalendar.this, VisitRegister.class);
    startActivity(toVisitRegister);
    finish();
}

这里是异步任务

public class startingThread extends AsyncTask<String, String, String> { 
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        startingProgress = new ProgressDialog(MainCalendar.this);
        startingProgress.setTitle("Visit Register");
        startingProgress.setMessage("Initializing...");
        startingProgress.show();
        }

    @Override
    protected String doInBackground(String... params) {
        return null;
    }

    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
        if(MainCalendar.this.startingProgress != null) {
            MainCalendar.this.startingProgress.dismiss();
        }
    }
}

我也尝试在 onPostExecute 中调用 startActivity,但没有成功。因此,我正在等待您对这个问题的意见和建议。任何帮助将不胜感激。

谢谢。

【问题讨论】:

    标签: android progressdialog


    【解决方案1】:
    I also tried to call startActivity in onPostExecute,
    

    将 Activity 上下文传递给 startingThread AsyncTask,并将您的启动活动代码放入 AsyncTask 的 onPostExecute()

    @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);
            if(MainCalendar.this.startingProgress != null) {
                MainCalendar.this.startingProgress.dismiss();
                Intent toVisitRegister = new Intent(MainCalendar.this, VisitRegister.class);
                mContext.startActivity(toVisitRegister);
                mContext.finish();
            }
        }
    

    这里的mContext 是您当前MainCalendar 活动的上下文。

    【讨论】:

    • 当我点击要切换的组件时,进度对话框显示不到一秒钟。然后,我把dismiss()放在finish()下面,但是这次进度轮没有旋转。对于 mContext,finish() 方法也是未定义的。
    • 将 mContext 转换为 Activity。喜欢,((Activity)mContext).finish();
    • 还要检查你的VisitRegisterActivity有没有在onCreate()或者onStart()里面做了什么繁重的工作?
    • VisitRegister 确实是一项繁重的活动。我尝试在 onStart() 方法上做这些繁重的工作,但效果不佳。那么我们该如何处理这些繁重的活动呢?
    • 实际上,您的主要问题是 VisitRegister 活动的繁重工作。在 VisitRegisteronCreate() 中启动 AsyncTask,并在完成更新 VisitRegister UI 后在 AsyncTask 中完成所有繁重的工作。因此,切换 Activity 所花费的时间变得更少。
    【解决方案2】:

    查看您的实现,AsyncTask 将没有时间工作,因为您将立即跳转到下一个 Activity。尝试在 PostExecute() 中调用下一个活动。

    I also tried to call startActivity in onPostExecute, but it didn't work. 
    

    你是这样做的吗:

    public void toVisitRegister(Event event) { //Switching to the second activity
        new startingThread().execute();
    }
    
    public class startingThread extends AsyncTask<String, String, String> { 
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            startingProgress = new ProgressDialog(MainCalendar.this);
            startingProgress.setTitle("Visit Register");
            startingProgress.setMessage("Initializing...");
            startingProgress.show();
            }
    
        @Override
        protected String doInBackground(String... params) {
            return null;
        }
    
        @Override
        protected void onPostExecute(String result) {
             if(MainCalendar.this.startingProgress != null) {
                MainCalendar.this.startingProgress.dismiss();
            }
        Intent toVisitRegister = new Intent(MainCalendar.this, VisitRegister.class);
        startActivity(toVisitRegister);
        finish();
    
        }
    }
    

    【讨论】:

    • 是的,我做到了,但进度对话框显示不到一秒钟,应用程序等待几秒钟才能切换。
    • 在 VisitRegister 活动的 onCreate() 方法中做了什么?
    • 一个适配器使用从 SQLite 获取的大量数据的接口填充七个 Spinner,另一个适配器使用 AutoCompleteTextView。控制这些组件是否设置选择。所以 VisitRegister 是一项相当繁重的活动。
    • 尝试在 AsyncTask 中加载那些繁重的任务
    • 我尝试了这个实现,它奏效了,不是很令人满意,但你的方法是正确的。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-29
    • 2018-03-15
    • 2013-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多