Re: [android-group-japan: 9527] スレッドを用いたprogressDialog表示について

1,593 views
Skip to first unread message

古澤康太郎

unread,
Feb 21, 2011, 11:02:03 PM2/21/11
to android-g...@googlegroups.com
ご返答ありがとうございます。
中略部分で、Bitmapの編集処理を行っているのですが、そのBimapがActivityのメンバでなのですが、もしかしてそれが原因なのでしょうか?imageViewもあるのですが、そちらへはスレッド側から繋がりを持たせていません。
また、
>Activity内のContextにかかわる処理をする場合
ということは、スレッド内からintentによる画面の切り替え等はもちろん、シークバーの調節も行うべきではないという事ですよね?
しかし、なぜダイアログが処理の前ではなく後に表示されてしまうのかが分かりません。ダイアログも現在のActivityの要素の一つとして表示されているのですよね?Activityを切り替えると、ダイアログも一緒に消えてしまうので、そう考えているのですが、もしかしてこれは勘違いでしょうか。
まだandroidの細部までは理解できていないので、初歩的な質問かもしれませんが、よろしくお願いします。

2011年2月22日11:53 yokmama <hijirin...@gmail.com>:
夜子ままです

下記のプログラムをみるかぎりスレッドは実行されているようです。
症状からみると、中略されている処理の中に問題がありそうです。

スレッド内から、Activity内のContextにかかわる処理をする場合は
結局主処理に影響がでるため、その部分がボトルネックになっていると
かんがえられませんか?

2011年2月22日11:44 K・F <kisaragi....@gmail.com>:

お世話になります。
スレッドを用いてprogressDialogを表示させようとしているのですが、どうにも動作がおかしいので、質問させていただきます。

public class ClassTEST extends Activity implements Runnable {
   private ProgressDialog progressDialog;

   @Override
       public void onCreate(Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);

           progressDialog = new ProgressDialog(this);
           progressDialog.setTitle("処理中");
           progressDialog.setMessage("処理を実行中です");
           progressDialog.setIndeterminate(false);

progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
           progressDialog.show();

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

   public void run() {
       // 時間のかかる処理をここに記述。
~~中略~~

       handler.sendEmptyMessage(0);
   }

   private Handler handler = new Handler() {
       public void handleMessage(Message msg) {
           // 処理終了時の動作をここに記述。

           // プログレスダイアログ終了
           progressDialog.dismiss();
       }
   };
}

あるサイト様のサンプルを改良しているのですが、こんな感じです。
デバッグエラーは発生せず、動作も普通にするのですが、DDMSで処理中のログを見てみると、ERROR: thread attach failed
が発生しています。その為か、中略している部分に5秒ほどかかる重い処理を含ませると、progressDialogが表示される前に画面が固まり、処
理が終わるとprogressDialogが表示されて直ぐに止まるという動きをしてしまいます。スレッドを用いずに行ったら同じような動作になったの
で、スレッドが機能していないのだと思います。
質問といたしましては、

・ERROR: thread attach failed とはなにか? 解決方法はあるのでしょうか?
・処理が終わってからprogressDialogが出るのは、上のエラーの所為か、それとも設計が悪いのか?

の2点です。どちらかの回答でも構いません。お解かりの方がいらっしゃれば、ご教授願えたらと思います。
よろしくお願いいたします。

--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
このグループから退会するには、android-group-j...@googlegroups.com にメールを送信してください。
詳細については、http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。




--
*************************************************
Re:Kayo-System Co.,Ltd. 

CEO    Masafumi Terazono
Twitter @yokmama
*************************************************


--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
このグループから退会するには、android-group-j...@googlegroups.com にメールを送信してください。
詳細については、http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。

K・F

unread,
Feb 21, 2011, 9:44:28 PM2/21/11
to 日本Androidの会

古澤康太郎

unread,
Feb 22, 2011, 12:38:37 AM2/22/11
to android-g...@googlegroups.com
夜子まま様、度々申し訳ございません。
Thread.sleep(5000) に置き換えてみたところ、やはりダイアログはスリープした後に表示されました。試しに別のプロジェクトで作り直して見たところ、やはり結果は同様でした。
ここまでくると、エミュレーターかERROR: thread attach failedが怪しいです。ERROR: thread attach failedはランタイムエラーのようなのですが、詳細が見つかりません。エラー番号もないのです。
メソッドを使うのに、権限やエミュレーターの設定などが必要なのでしょうか……?

2011年2月22日13:36 yokmama <hijirin...@gmail.com>:
夜子ままです

考えはあっています。
DialogのshowをonCreate で呼んでいますが。
省略のなかでやっているBitmap編集処理が、実際の描画処理のスレッドに
影響しているのは間違いないとおもいます。
ためしに、省略処理は
Thread.sleep(5000) におきかえてみてください。
意図したとおりにうごくはずです。

ERROR: thread attach failed

もきになりますね、

2011年2月22日13:02 古澤康太郎 <kisaragi....@gmail.com>:

yokmama

unread,
Feb 21, 2011, 9:53:15 PM2/21/11
to android-g...@googlegroups.com
夜子ままです

下記のプログラムをみるかぎりスレッドは実行されているようです。
症状からみると、中略されている処理の中に問題がありそうです。

スレッド内から、Activity内のContextにかかわる処理をする場合は
結局主処理に影響がでるため、その部分がボトルネックになっていると
かんがえられませんか?

2011年2月22日11:44 K・F <kisaragi....@gmail.com>:
お世話になります。
--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
このグループから退会するには、android-group-j...@googlegroups.com にメールを送信してください。
詳細については、http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。

yokmama

unread,
Feb 22, 2011, 1:01:14 AM2/22/11
to android-g...@googlegroups.com
夜子ままです

こちらでためしに似たようなことをしてみましたが。
ERRORは発生しませんでした。

ちょっと長いですが、テストしたコードです。

下記のサンプルでは、onCreate側で行っている処理を
なるべく外にだしてみました。
エラーも発生していません。

ERROR: thread attach faile

はわかりませんね、Runtime処理の中で発生するエラーのようですが、
詳細はわかりません。

    ProgressDialog progressDialog;


    /** Called when the activity is first created. */

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);


        progressDialog = new ProgressDialog(this);

        /*progressDialog.setTitle("処理中");

        progressDialog.setMessage("処理を実行中です");

        progressDialog.setIndeterminate(false);


        progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);

        progressDialog.show();*/


        Thread thread = new Thread(this);

        thread.start();

    }


    public void run() {

        // 時間のかかる処理をここに記述。

        try {

            progressDialog.setTitle("処理中");

            progressDialog.setMessage("処理を実行中です");

            progressDialog.setIndeterminate(false);


            progressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);

            handler.post(new Runnable() {

                @Override

                public void run() {

                    progressDialog.show();

                }

            });


            Thread.sleep(5000);

        } catch (InterruptedException e) {

            // TODO 自動生成された catch ブロック

            e.printStackTrace();

        }

        handler.sendEmptyMessage(0);

    }


    private Handler handler = new Handler() {

        public void handleMessage(Message msg) {

            // 処理終了時の動作をここに記述。


            // プログレスダイアログ終了

            progressDialog.dismiss();

        }

    };




2011年2月22日14:38 古澤康太郎 <kisaragi....@gmail.com>:

古澤康太郎

unread,
Feb 22, 2011, 1:23:12 AM2/22/11
to android-g...@googlegroups.com
ご返答ありがとうございます!それもコードなで頂いて……申し訳ないです。
デバッグしてみたところ、問題なく動作しました。元のプログラム側でも動いています。ちょっと感激してしまいました。
コードを見てみたところ、どうやら完全に私の勘違いというか、認識不足だったようです。申し訳ないです。このあたりをもう一度勉強しなおそうと思います。
例の
ERROR: thread attach faile

なのですが、

handler.post(new Runnable() {
                @Override
                public void run() {
                    progressDialog.show();
                }
            });
の部分を意図的に消してみたところ、発生しました。もしかしたら、handler周りのエラーなのかもしれません。これも機会があったら詳しく調べてみます。
今回は本当にありがとうございました。


2011年2月22日15:01 yokmama <hijirin...@gmail.com>:

Yoshinori

unread,
Feb 22, 2011, 2:06:21 AM2/22/11
to 日本Androidの会
古澤様

Runnableをimplementせずにnewして場合も同様にProgressDialogが表示されませんでしょうか?
# すぐに環境がなく試していませんが、、、

On 2月22日, 午後2:38, 古澤康太郎 <kisaragi.gotokut...@gmail.com> wrote:
> 夜子まま様、度々申し訳ございません。
> Thread.sleep(5000)
> に置き換えてみたところ、やはりダイアログはスリープした後に表示されました。試しに別のプロジェクトで作り直して見たところ、やはり結果は同様でした。
> ここまでくると、エミュレーターかERROR: thread attach failedが怪しいです。ERROR: thread attach
> failedはランタイムエラーのようなのですが、詳細が見つかりません。エラー番号もないのです。
> メソッドを使うのに、権限やエミュレーターの設定などが必要なのでしょうか……?
>

> 2011年2月22日13:36 yokmama <hijirinhiji...@gmail.com>:


>
>
>
>
>
>
>
> > 夜子ままです
>
> > 考えはあっています。
> > DialogのshowをonCreate で呼んでいますが。
> > 省略のなかでやっているBitmap編集処理が、実際の描画処理のスレッドに
> > 影響しているのは間違いないとおもいます。
> > ためしに、省略処理は
> > Thread.sleep(5000) におきかえてみてください。
> > 意図したとおりにうごくはずです。
>
> > ERROR: thread attach failed
>
> > もきになりますね、
>

> > 2011年2月22日13:02 古澤康太郎 <kisaragi.gotokut...@gmail.com>:
>
> >> ご返答ありがとうございます。
>
> >> 中略部分で、Bitmapの編集処理を行っているのですが、そのBimapがActivityのメンバでなのですが、もしかしてそれが原因なのでしょうか?im ageViewもあるのですが、そちらへはスレッド側から繋がりを持たせていません。


> >> また、
> >> >Activity内のContextにかかわる処理をする場合
> >> ということは、スレッド内からintentによる画面の切り替え等はもちろん、シークバーの調節も行うべきではないという事ですよね?
>

> >> しかし、なぜダイアログが処理の前ではなく後に表示されてしまうのかが分かりません。ダイアログも現在のActivityの要素の一つとして表示されているので すよね?Activityを切り替えると、ダイアログも一緒に消えてしまうので、そう考えているのですが、もしかしてこれは勘違いでしょうか。
> >> まだandroidの細部までは理解できていないので、初歩的な質問かもしれませんが、よろしくお願いします。
>
> >> 2011年2月22日11:53 yokmama <hijirinhiji...@gmail.com>:


>
> >>> 夜子ままです
>
> >>> 下記のプログラムをみるかぎりスレッドは実行されているようです。
> >>> 症状からみると、中略されている処理の中に問題がありそうです。
>
> >>> スレッド内から、Activity内のContextにかかわる処理をする場合は
> >>> 結局主処理に影響がでるため、その部分がボトルネックになっていると
> >>> かんがえられませんか?
>

> >>> 2011年2月22日11:44 K・F <kisaragi.gotokut...@gmail.com>:

yokmama

unread,
Feb 21, 2011, 11:36:03 PM2/21/11
to android-g...@googlegroups.com
夜子ままです

考えはあっています。
DialogのshowをonCreate で呼んでいますが。
省略のなかでやっているBitmap編集処理が、実際の描画処理のスレッドに
影響しているのは間違いないとおもいます。
ためしに、省略処理は
Thread.sleep(5000) におきかえてみてください。
意図したとおりにうごくはずです。

ERROR: thread attach failed

もきになりますね、

2011年2月22日13:02 古澤康太郎 <kisaragi....@gmail.com>:

古澤康太郎

unread,
Feb 22, 2011, 3:10:21 AM2/22/11
to android-g...@googlegroups.com
ダイアログのみでしたら表示できますね。
スレッドを作成する場合は、Runnableがないとthis出来なくなるので無理ですが、ダイアログの処理だけを外に出せば表示できます。
でもスレッドをnewすることそのものは可能なようです。

2011年2月22日16:06 Yoshinori <yoshin...@gmail.com>:

unread,
Feb 23, 2011, 2:11:58 AM2/23/11
to 日本Androidの会
こんにちは 城です

> ・ERROR: thread attach failed とはなにか? 解決方法はあるのでしょうか?
> ・処理が終わってからprogressDialogが出るのは、上のエラーの所為か、それとも設計が悪いのか?
>
> の2点です。どちらかの回答でも構いません。お解かりの方がいらっしゃれば、ご教授願えたらと思います。

AsyncTask 使うといいですよ。

unread,
Feb 23, 2011, 2:29:22 AM2/23/11
to 日本Androidの会
こんな感じでしょうかね?

----AsyncTaskCallback.java----
public interface AsyncTaskCallback<S, F> {

void onTaskSuccessed(S object);

void onTaskFailed(F object);
}

----Main.java----
import android.os.AsyncTask;

public class Main extends Activity implements
AsyncTaskCallback<MySuccessed, MyFailed> {

ProgressDialog progressDialog;

private AsyncTask<String, Integer, Object> heavyTask;

@Override
public void onCreate(Bundle savedInstanceState) {
heavyTask = new AsyncTask<String, Integer, Object>() {

@Override
protected void onPreExecute() {
super.onPreExecute();
progressDialog = new ProgressDialog(Main.this);

progressDialog.setTitle(getString(R.string.progress_dialog_title));

progressDialog.setMessage(getString(R.string.progress_dialog_message));
progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
progressDialog.setCancelable(true);
progressDialog.setOnCancelListener(Main.this);
progressDialog.show();
}

@Override
protected Object doInBackground(String... params) {
MySuccessed mySuccessed;

try{
while(true){
publishProgress(read);

if (this.isCancelled()) {
return new MyFailed();
}

if(finishTask){
break;
}
}
}catch(Exception e){
return new MyFailed();
}

return mySuccessed;
}

@Override
protected void onProgressUpdate(Integer... params) {
super.onProgressUpdate(params[0]);
progressDialog.incrementProgressBy(params[0]);
}

@Override
protected void onPostExecute(Object result) {
super.onPostExecute(result);
progressDialog.dismiss();
progressDialog = null;

if (result instanceof MySuccessed) {
onTaskSuccessed((MySuccessed)result);
} else if (result instanceof mySuccessed) {
onTaskFailed((MyFailed)result);
}
}

@Override
protected void onCancelled() {
if (progressDialog != null && progressDialog.isShowing()) {
progressDialog.dismiss();
progressDialog = null;
}

super.onCancelled();
}
};

heavyTask.execute(String params);
}

@Override
public void onTaskSuccessed(MySuccessed mySuccessed) {

}

@Override
public void onTaskFailed(MyFailed myFailed) {
}

@Override
public void onCancel(DialogInterface dialog) {
heavyTask.cancel(true);
}
}

K・F

unread,
Feb 23, 2011, 3:28:41 AM2/23/11
to 日本Androidの会
おお。まだ返信があるとは。城さんありがとうございます!
これはちょっと試した事が無いですね。試してみます。
結局、
ERROR: thread attach failed
は実機でやると出にくいという事実が分かっただけで、何なのかよく分からずじまいですが、取りあえずスレッド関係はまだまだ奥が深いようなので、今後も
勉強を続けます。
ありがとうございました!

unread,
Feb 23, 2011, 5:03:28 AM2/23/11
to 日本Androidの会
こんばんは
城です

> おお。まだ返信があるとは。城さんありがとうございます!
まとめて受信のタイプなので、気づくのが遅くてすみません。

> これはちょっと試した事が無いですね。試してみます。
> 結局、
> ERROR: thread attach failed
> は実機でやると出にくいという事実が分かっただけで、何なのかよく分からずじまいですが、取りあえずスレッド関係はまだまだ奥が深いようなので、今後も
> 勉強を続けます。
> ありがとうございました!
昔お酒を飲みながら、
適当にソース見て、
適当に考えたことなので、
話半分で聞いてもらえれば。

Handler#post や Handler#sendMesssage は
即時UIを更新するようにQueueを送ります。
QueueにはUI更新予定の時間が乗ってます。

現在あるQueueより新しいQueueが送られると、
古いQueueはキャンセルされます。

ダイアログ表示等の重いUI更新しようとしたときに、
次々とQueueが送られて来て、キャンセルが続く。
それでもまだダイアログは表示されないので、
UIスレッドは重い。
最終的には、一番最後のQueue
恐らくここでは ダイアログのバーがMAXの状態が表示されて、
すぐに消える。

という感じだと思います。
Reply all
Reply to author
Forward
0 new messages