【问题标题】:How to display progress dialog before starting an activity如何在开始活动之前显示进度对话框
【发布时间】:2012-09-06 12:01:16
【问题描述】:

如何在活动之间的长时间过渡期间安装旋转进度条(或对话框)?我已经看到了有助于实现 AsyncTask 的解决方案 - 我在帖子中提到了链接将 How to display progress dialog before starting an activity in Android? ,但问题是进度条没有旋转。

package expir.java.file;

import java.io.IOException;

import javax.xml.parsers.ParserConfigurationException;

import org.xml.sax.SAXException;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.Window;
import android.widget.Button;

public class ExpirActivity extends Activity {    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.main);        
        Button mapButton = (Button)findViewById(R.id.first_button);
        mapActivityIntent = new Intent(this, MyMapActivity.class);
        pDialog = new ProgressDialog(this);

        mapButton.setOnClickListener(new View.OnClickListener() {           
            public void onClick(View v) {
                pDialog.setMessage("Loading...");
                new MyTask(pDialog).execute();              
            }   
        });

        Button downloadButton = (Button)findViewById(R.id.second_button);        
        downloadButton.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {               
                as.DownloadFromUrl("0", "null");;
            }
        }); 
        Button parseButton = (Button)findViewById(R.id.third_button);        
        parseButton.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {               
                SAXParserCreateDataBase gi = new SAXParserCreateDataBase();
                try {
                    gi.start(ExpirActivity.this);
                } catch (SAXException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (ParserConfigurationException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        });
        Button updateButton = (Button)findViewById(R.id.fourth_button);        
        updateButton.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {               
                SAXParserCreateDataBase gi = new SAXParserCreateDataBase();
                try {
                    gi.update(ExpirActivity.this);
                } catch (ParserConfigurationException e) {
                    e.printStackTrace();
                } catch (SAXException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }); 
    }    

    public class MyTask extends AsyncTask<Void, Void, Void> {
          public MyTask(ProgressDialog progress) {
            this.progress = progress;
          }

          public void onPreExecute() {
            progress.show();
          }

          public Void doInBackground(Void... unused) {
            startActivity(mapActivityIntent);
            return null;            
          }

          public void onPostExecute(Void unused) {
            progress.dismiss();
          }
          ProgressDialog progress;
    }


    DownloadPrimaryDate as = new DownloadPrimaryDate();
    Intent mapActivityIntent;
    ProgressDialog pDialog;
}

更新:

LogCat 结果:

FirstActivity.onCreate()

FirstActivity.onStart()

FirstActivity.onResume()

FirstActivity.onPause()

SecondActivity.onCreate()

SecondActivity.onStart()

SecondActivity.onResume()

FirstActivity.onStop()

这就解释了为什么会这样。

更新
在我意识到我在想什么 - 并不是我所有在活动之间实现这种转换的尝试都是均匀的。

【问题讨论】:

  • 如果你实际上介于这两个活动之间......你认为你的进度条会出现在哪个 VIEWGROUP 上? progreeBar 挂了,因为 UI 被阻塞了!我不认为你可以在两个活动之间显示 ProgressBar...(在第一个 onDestroy 之后和第二个 onCreate 之前)
  • @Aditya Nikhade 您的陈述是有道理的,但是-据我了解,AsincTask 允许将对话与活动本身分开显示(也许我错了。)我不明白您如何在 printsygt 中实现由我构思 - 我试图为此分配一个单独的线程并执行当你按下按钮时应该触发的代码 - 但它掩盖了这些结果。
  • 让我们说点简单的...你真正想展示什么,什么时候展示?活动之间说清楚?还是在第一次结束之前?还是在第二次开始之前?
  • @Aditya Nikhade 情况是这样的——点击按钮加载卡片活动后。实际上,当您单击第一个活动时它停止但在 3-4 秒后仍然可见时会显示地图 - 这一次可以通过以下事实来解释:在您显示地图之前,应用程序知道坐标并分析数据库 SQLite (大约 3000 行)。我希望屏幕显示进度条(或 ProgressDialog)的 3-4 秒。 – Siruk Viktor 5 分钟前
  • 所以在单击时放置一个 AsyncTask... 将 dialog.show 放在 onPre 中 dialog.dismiss 在 onPost 中,然后认为单击 doInBackground 中的按钮已完成。 ...因此,当位置跟踪开始时,对话框出现,完成时对话框消失!!

标签: android android-activity progress-bar


【解决方案1】:

我看到了两种解决方案,具体取决于需要很长时间的任务所在。

如果长任务由第一个活动执行,则在按下按钮时创建一个进度对话框,将onShowListener 设置为他的对话框,在 onShow 回调中启动您的异步任务。任务完成后,关闭您的进度对话框并开始下一个活动。

如果长任务由下一个活动执行,只需在活动onCreate 中设置一个简单的布局并创建一个进度对话框,设置 onShowListener 并在 onShow 中启动您的AsyncTtask 并在完成后加载其余部分ui 并关闭对话框。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-03
    • 2019-12-01
    相关资源
    最近更新 更多