切换到另一个活动时,进度对话框卡死了

3
我有两个活动。当我通过意图切换到第二个活动时,需要3-4秒钟,因为它具有许多组件,这些组件使用适配器从SQLite中获取数据等。因此,我想在切换时显示进度对话框。
我已经挖掘了关于此目的的话题,并尝试了其中的许多方法:
1-) 在第二个活动上使用AsyncTask。它不会在我单击组件以切换到第二个活动时立即显示进度对话框。它会等待3-4秒钟,然后进度对话框出现不到一秒钟,这是不友好的方式。
2-) 在第一个活动上使用AsyncTask。它在我单击该组件时立即显示,但进度轮不会旋转。进度对话框会冻结。
3-) 在第二个活动的onStart()方法上使用AsyncTask。这会导致第一种方式。
下面的代码实现了上述第二种方式,在第一个活动上使用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();
}

这里是AsyncTask

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,但没有成功。因此,我正在等待您对此问题的意见和建议,非常感谢您的帮助。
谢谢。
2个回答

2
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()方法下方,但这次进度轮没有旋转。此外,finish()方法对于mContext是未定义的。 - Egemen Hamutçu
将mContext转换为Activity类型,例如:((Activity)mContext).finish(); - user370305
请检查您的“VisitRegister”活动中是否在“onCreate()”或“onStart()”中执行了任何繁重的工作。 - user370305
VisitRegister是一个非常繁重的活动。我尝试在onStart()方法中完成这些繁重的工作,但效果不佳。那么我们该如何处理这个繁重的活动呢? - Egemen Hamutçu
1
实际上,您的主要问题是在VisitRegister活动中进行了大量的工作。在VisitRegisteronCreate()中启动AsyncTask,并在AsyncTask中执行所有繁重的工作,当它完成时更新VisitRegister UI。这样,在切换活动时所需的时间就会变少。 - user370305
我尝试了这个实现,它能够工作,虽然不是很令人满意,但你的方法是正确的。谢谢。 - Egemen Hamutçu

1
看了你的实现,AsyncTask 没有时间工作,因为你会立即跳转到下一个 Activity。尝试在 PostExecute() 中调用下一个 Activity。
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();

    }
}

是的,我试过了,但进度对话框只显示了不到一秒钟,应用程序等待了几秒钟才切换。 - Egemen Hamutçu
在VisitRegister活动的onCreate()方法中,您要做什么? - Lazy Ninja
使用接口从SQLite获取大量数据,通过一个适配器填充七个微调器和另一个适配器填充AutoCompleteTextView。控制这些组件是否设置选择。因此,VisitRegister是一个非常繁重的活动。 - Egemen Hamutçu
1
尝试将那些繁重的任务加载到AsyncTask中。 - Lazy Ninja
我尝试了这个实现,它能够工作,虽然不是很令人满意,但你的方法是正确的。谢谢。 - Egemen Hamutçu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接