【问题标题】:Issue with Asynctask and progressdialog?Asynctask 和 progressdialog 的问题?
【发布时间】:2012-10-17 18:51:49
【问题描述】:

我是 android 的菜鸟,我试图在启动画面之后的 OnCreate 方法期间显示进度对话框。目前,在我的启动画面之后,屏幕黑屏大约 5 秒钟,然后出现布局。我正在使用 Asynctask 来执行我的后台操作,所以我不明白为什么在应用程序初始化时没有出现进度对话框而不是 5 秒的黑色。这仅适用于 Android 3.0 及更低版本。所有后续 sdk 版本都会正确显示进度对话框。任何帮助是极大的赞赏。

@Override
public void onCreate(Bundle savedInstanceState) {       
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    //wakelock
    PowerManager pM = (PowerManager)getSystemService(Context.POWER_SERVICE);
    wL = pM.newWakeLock(PowerManager.FULL_WAKE_LOCK, "Screen Dim");
    wL.acquire();


    LoadingData dataLoaded = new LoadingData();
    dataLoaded.execute("");

    ---code for UI Thread---

    }//--End onCreate

private class LoadingData extends AsyncTask<String, Integer, String> {
    @Override
    protected String doInBackground(String... sUrl) {
        try {
            //TWITTER API CODE HERE

            } catch (Exception e) {
                Log.e("log_tag", "Error parsing data "+ e.toString());
            }
            publishProgress(33);

            //DOWNLOADING IMAGES CODE HERE
            try{

            }catch(Exception e){

            } 
            publishProgress(66);

            //FOREX RATES CODE HERE
            try {

        }catch(JSONException e)        {
         Log.e("log_tag", "Error acquiring forex data "+e.toString());
        }
        publishProgress(100);


        return null;
    }


    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        dialog = new ProgressDialog (GoldandSilverCoinCalculatorActivity.this);
        dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        dialog.setMessage("Loading... please wait");
        dialog.setIndeterminate(false);
        dialog.setMax(100);
        dialog.setProgress(0);
        dialog.show();
    }


    @Override
    protected void onProgressUpdate(Integer... progress) {
        super.onProgressUpdate(progress);
        dialog.setProgress(progress[0]);
    } 

    @Override       
    protected void onPostExecute(String result) {       
        super.onPostExecute(result);       
        dialog.dismiss();

       }


}

----编辑---- 我的 OnResume 和 OnPause 方法

@Override
protected void onPause() {
    // TODO Auto-generated method stub
    compass.disableCompass();
    super.onPause();
    wL.release();
    lm.removeUpdates(this);
}



@Override
protected void onResume() {
    // TODO Auto-generated method stub
    compass.enableCompass();
    super.onResume();
    wL.acquire();
    lm.requestLocationUpdates(towers, 500, 1, this);
}

【问题讨论】:

  • 在 --- UI 线程的代码--- 中有什么?在整个 OnCreate 完成之前,您的对话框不会显示。所以你的 UI 初始化可能需要很长时间
  • 这是我为布局实例化按钮、微调器、文本视图和编辑文本的地方。
  • 确保您的 onCreate/onStart/onResume 中没有位图操作或处理密集型代码。
  • 请检查我的编辑。我刚刚发布了我的 onPause 和 OnResume。这些操作会阻塞我的 UI 线程吗?
  • 这段代码没有阻塞!我不知道为什么会这样!我建议记录您的代码以确保没有任何东西阻止您的 onCreate

标签: android android-layout android-asynctask progress-bar progressdialog


【解决方案1】:

要在 AsyncTask 中显示进度对话框,请使用 AsyncTask 的 onPreExecute() 方法

    @Override
    protected void onPreExecute()
    {
        super.onPreExecute();
        pDialog = new ProgressDialog(YOUR_ACTIVITY.this);
        pDialog.setMessage("Please wait...");
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(false);   // if true, it enables to dismiss dialog with back button
        pDialog.show();
    }

【讨论】:

  • 感谢您的回复。我仍然遇到 5 秒的黑屏。
  • 我认为问题出在 '//wakelock' 请尝试评论所有与它相关的行并按照我的解决方案。这应该可以正常工作。
【解决方案2】:

将你所有的代码行一一注释...看看需要 5 秒

我认为你的问题在于:

super.onCreate(savedInstanceState);
setContentView(R.layout.main);

应该在 onCreate 的顶部,而不是在获取唤醒锁之后

【讨论】:

  • 我只是尝试像您建议的那样重新排序行,但没有运气。所以我想我会一一评论我的台词。
猜你喜欢
  • 1970-01-01
  • 2014-05-29
  • 1970-01-01
  • 2015-04-15
  • 1970-01-01
  • 1970-01-01
  • 2014-07-25
  • 2014-12-18
相关资源
最近更新 更多