应用程序启动时Progressdialog无法正常工作

时间:2013-05-07 12:58:05

标签: android

我想在我的应用程序打开时显示一个进度对话框“加载”。

我尝试使用AsyncTask和其他一些方法(Uithread,线程)来完成此操作并且所有方法都失败了。

我不知道为什么,但是我的手机屏幕上没有显示progressdialog。我总是看到一个黑屏。

在getApnData抛出异常并显示我的活动UI组件后,进度对话框有效,但为时已晚

以下是我的一些代码部分。

//1-1-1-1-1
//On create or OnStart

LoginProgressTask task1 = new LoginProgressTask();  
        task1.execute();

//Inner class
    class LoginProgressTask extends AsyncTask<String, Integer, Boolean> {
        @Override
        protected Boolean doInBackground(String... params) {
            try {
                getApnData(); // Do your real work here
            } catch (Exception e) {
                e.printStackTrace();
            }
            return Boolean.TRUE; // Return your real result here
        }

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            LoginUI.this.pd = ProgressDialog.show(LoginUI.this, "", "Loading...", true, true);
        }

        @Override
        protected void onPostExecute(Boolean result) {
            // LoginUI.this.pd.dismiss();

        }
    }

//2-2-2-2-2
//OnCreate or OnStart
pd = ProgressDialog.show(this, "", "Loading...", true, false);

thread = new Thread(this);
thread.start();


//run
@Override
    public void run() {
        try {
            firstRunUI();
            handler.sendEmptyMessage(0);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

//UIRun
    public void firstRunUI() {
        runOnUiThread(new Runnable() {

            @Override
            public void run() {
                try {
                    getApnData();
                } catch (Exception e) {
                    e.printStackTrace();
                }

            }
        });
    }

//Handler
private Handler handler = new Handler() {
        public void handleMessage(Message msg) {
            pd.dismiss();


        }
    };

2 个答案:

答案 0 :(得分:2)

好的,首先, 您可以使用以下方案显示进度:

  1. 使用您的LoginProgressTask如下

    new LoginProgressTask()。execute();

  2. 更改

    LoginUI.this.pd = ProgressDialog.show(LoginUI.this,“”,“Loading ...”,true,true)

  3. 在使用onCreate或onStart而不是问题中的第二个代码块时使用以下内容

    new LoginProgressTask()。execute();

  4. 这是一个完整的例子

    class SomeActivity extends Activity {
            ProgressDialog pd ;
            class LoginProgressTask extends AsyncTask<String, Integer, Boolean> {
             @Override
            public void onPreExecute(){
             pd = ProgressDialog.show(LoginUI.this, "", "Loading...", true, true);
            }
                    @Override
                    protected Boolean doInBackground(String... params) {
                        try {
                            getApnData(); // Do your real work here
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                        return Boolean.TRUE; // Return your real result here
                    }
             }
    
          @Override
                protected void onPostExecute(Boolean result) {
                    pd.dismiss(); //or use handlers it is better
    
                }
            }
    
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                         new LoginProgressTask().execute();
        }
        }
    

    这将为你完成工作!!

    Nad确保你在PostExecute方法上关闭ProgressDialog *

    注意 不要在主UI线程中创建视图,因为这可能会导致内存泄漏

    <强>更新 从getAbnData()更新UI元素 你应该使用处理程序

    Handler handler = new Hanlder(){
        @Override
        public void handleMessage(int what){
    //changing UI Elements code comes here
    
    }
    }
    

    从代码中使用handler.sendMessage(NUMER)

    然后它将处理消息

    Communicating with the UI Thread

答案 1 :(得分:1)

这段代码解决了您的问题,甚至没有使用AsyncTask。希望它可以帮到你。

 private void Load() {
         // TODO Auto-generated method stub     
        p = new ProgressDialog(YourActivity.this);
        p.setMessage("Loading...");
        p.setCancelable(false);
        p.show();

        new Thread(new Runnable() {
            public void run() {
                // TODO Auto-generated method stub                  
                mHandler.sendEmptyMessage(0);
            }
        }).start();
    } 
}

private Handler mHandler = new Handler() {
    public void handleMessage(android.os.Message msg) {
        super.handleMessage(msg);
        p.dismiss();
        switch (msg.what) {

        case 0:
            //LOAD YOUR ACTIVITY HERE
            break;
        }
    }
};