进度对话框在切换到另一个活动时冻结

时间:2012-11-16 07:54:52

标签: android progressdialog

我有两项活动。虽然通过意图切换到第二个活动,但它需要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();
}

这是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 个答案:

答案 0 :(得分:2)

I also tried to call startActivity in onPostExecute,

将活动上下文传递给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活动的上下文。

答案 1 :(得分:1)

查看您的实现,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();

    }
}