夜子ままです下記のプログラムをみるかぎりスレッドは実行されているようです。症状からみると、中略されている処理の中に問題がありそうです。スレッド内から、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 TerazonoTwitter @yokmama*************************************************
--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
このグループから退会するには、android-group-j...@googlegroups.com にメールを送信してください。
詳細については、http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。
夜子ままです考えはあっています。DialogのshowをonCreate で呼んでいますが。省略のなかでやっているBitmap編集処理が、実際の描画処理のスレッドに影響しているのは間違いないとおもいます。ためしに、省略処理はThread.sleep(5000) におきかえてみてください。意図したとおりにうごくはずです。ERROR: thread attach failedもきになりますね、2011年2月22日13:02 古澤康太郎 <kisaragi....@gmail.com>:
お世話になります。
--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
このグループから退会するには、android-group-j...@googlegroups.com にメールを送信してください。
詳細については、http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。
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();
}
};
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>: