0

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

我尝试了 AsyncTask 和其他一些方法(Uithread、线程)来做到这一点,但都失败了。

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

在 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();


        }
    };
4

2 回答 2

2

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

  1. 按如下方式使用您的 LoginProgressTask

    新的 LoginProgressTask().execute();

  2. 改变

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

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

    新的 LoginProgressTask().execute();

这是一个完整的例子

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)

然后它将处理消息

与 UI 线程通信

于 2013-05-07T13:16:47.420 回答
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;
        }
    }
};
于 2013-05-07T13:16:44.590 回答