Activity内でProgressDialogが表示されない原因

処理の進行状況を表示するのにProgressDialogを使うときはどのようなタイミングでダイアログを表示して閉じるかが重要です。

例えば次のようにダイアログを表示した場合、プログレスダイアログは表示されません。

public class MyActivity extends Activity 
{
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        ProgressDialog progressDialog = new ProgressDialog(this);
        progressDialog.show();
        heavyProcess();
        progressDialog.dismiss();
    }
    
    private void heavyProcess()
    {
        /** 重い処理 ... */
    }
}

なぜこれが表示されないかというと時間のかかる処理をUIスレッド内で実行しているからです。

では、どうすればいいかというと次のように処理をスレッド内で実行すればOKです。

public class MyActivity extends Activity 
{
    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        ProgressDialog progressDialog = new ProgressDialog(this);
        progressDialog.show();
        heavyProcess();
    }
    
    private void heavyProcess()
    {
        new Thread(new Runnable()
        {
            @Override
            public void run()
            {
                /** 重い処理 ... */
                
                progressDialog.dismiss();
            }
        }.start();
    }
}

スレッド内で処理が終わった時にダイアログをdismissしています。

もしスレッド内でテキストビューのテキストを変更するなど、UIスレッドにアクセスすることがあれば、次のようにThread内でHandlerを使ってください。

new Thread(new Runnable()
{
    @Override
    public void run()
    {
        /** 重い処理 ... */
        
        new Handler().post(new Runnable()
        {
            @Override
            public void run()
            {
                /** UIスレッドにアクセス。*/
            }
        });
        
        progressDialog.dismiss();
    }
}.start();

以上がProgressDialogの表示の注意ポイントです。では、また!

関連項目
プライバシーポリシー