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 を使用します

    new LoginProgressTask().execute();

  2. 変化する

    LoginUI.this.pd = ProgressDialog.show(LoginUI.this, "", "読み込み中...", true, true)

  3. 問題の 2 番目のコード ブロックの代わりに onCreate または onStart を使用する場合は、次を使用します。

    new 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();
    }
    }

これはあなたのために仕事をします!!

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 に答える