0

プログレスバーとテキストビューを含むダイアログにカスタムレイアウトを使用しています。ダイアログが既に実行されている場合は、ダイアログのテキストを変更したい。これは、この操作を行うための私のコードです。

private static Dialog progressDialog = null;
public static void showLoadingProgress(String msg){
        Log.d("Util", "show loading progress"+progressDialog);//No i18n
        if(progressDialog!=null && progressDialog.isShowing()){
            TextView message = (TextView)progressDialog.findViewById(R.id.progressmsg);
            message.setText(msg);           
        }else{          
            progressDialog = new Dialog(MainActivity.getActivity().getApplicationContext());
            progressDialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
            progressDialog.setCancelable(false);
            progressDialog.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);
            progressDialog.setContentView(R.layout.customprogress);

            TextView message = (TextView)progressDialog.findViewById(R.id.progressmsg);
            message.setText(msg);

            progressDialog.show();
            Log.d("",progressDialog.isShowing()+""); //No i18n
        }
    }

    public static void hideLoadingProgress(){
        Log.d("Util", "close loading progress"+progressDialog);//No i18n

        if(progressDialog!=null){
        Log.d("ProgressDialog is not null, so making it null",""); //No i18n  
        progressDialog.dismiss();
        progressDialog = null;
        }
    }

このメソッドを try ブロックから、asyncTask doInBackground() の catch ブロックで呼び出しています。最初に try ブロックから呼び出すとダイアログが表示されますが、エラーが発生した場合は、catch ブロックから再度呼び出しが発生し、この Exception がスローされます

03-26 13:42:53.002: E/AndroidRuntime(16151): java.lang.RuntimeException: An error occured while executing doInBackground()
03-26 13:42:53.002: E/AndroidRuntime(16151):    at android.os.AsyncTask$3.done(AsyncTask.java:299)
03-26 13:42:53.002: E/AndroidRuntime(16151):    at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
03-26 13:42:53.002: E/AndroidRuntime(16151):    at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
03-26 13:42:53.002: E/AndroidRuntime(16151):    at java.util.concurrent.FutureTask.run(FutureTask.java:239)
03-26 13:42:53.002: E/AndroidRuntime(16151):    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
03-26 13:42:53.002: E/AndroidRuntime(16151):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
03-26 13:42:53.002: E/AndroidRuntime(16151):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
03-26 13:42:53.002: E/AndroidRuntime(16151):    at java.lang.Thread.run(Thread.java:856)
03-26 13:42:53.002: E/AndroidRuntime(16151): Caused by: android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
03-26 13:42:53.002: E/AndroidRuntime(16151):    at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:4746)
03-26 13:42:53.002: E/AndroidRuntime(16151):    at android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:823)
03-26 13:42:53.002: E/AndroidRuntime(16151):    at android.view.View.requestLayout(View.java:15468)
03-26 13:42:53.002: E/AndroidRuntime(16151):    at android.view.View.requestLayout(View.java:15468)
03-26 13:42:53.002: E/AndroidRuntime(16151):    at android.view.View.requestLayout(View.java:15468)
03-26 13:42:53.002: E/AndroidRuntime(16151):    at android.view.View.requestLayout(View.java:15468)
03-26 13:42:53.002: E/AndroidRuntime(16151):    at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:318)
03-26 13:42:53.002: E/AndroidRuntime(16151):    at android.view.View.requestLayout(View.java:15468)
03-26 13:42:53.002: E/AndroidRuntime(16151):    at android.view.View.requestLayout(View.java:15468)
03-26 13:42:53.002: E/AndroidRuntime(16151):    at android.widget.TextView.checkForRelayout(TextView.java:6313)
03-26 13:42:53.002: E/AndroidRuntime(16151):    at android.widget.TextView.setText(TextView.java:3567)
03-26 13:42:53.002: E/AndroidRuntime(16151):    at android.widget.TextView.setText(TextView.java:3425)
03-26 13:42:53.002: E/AndroidRuntime(16151):    at android.widget.TextView.setText(TextView.java:3400

これを解決するのを手伝ってください。

4

2 に答える 2

2

これらのメソッドをMainThread( UIThread:ビュー階層を作成した唯一のスレッドがそのビューにアクセスできます。 ) でこれらのメソッドを呼び出す必要があります。分離した上でそれらを呼び出す場合threadは、メソッドを使用してそれらを呼び出す必要があります: runOnUiThread():

YourActivity.this.runOnUiThread(new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                showLoadingProgress("Loading data...");
            }
        });

編集:そして、ここにサーバーからファイルをダウンロードしているときに表示されるチュートリアルProgressDialogがあります。それはまさにあなたが望むものだと思います。それを見てください

于 2013-03-26T10:06:50.363 に答える
0

AsyncTask の onProgressUpdate() をオーバーライドして、テキストと進行状況ダイアログを「変更」する必要があると思います。

    @Override
    protected void onProgressUpdate(Progress... values) {
        // Do your change here with your own data
    }

doInBackground() は、バックグラウンド スレッドで計算を実行することになっています。

于 2013-03-26T10:32:50.767 に答える