私は Android アプリで作業しており、AsyncTask クラスを使用して ProgressBar を実装しています。
問題は、一部のデバイスで、「CalledFromWrongThreadException: ビュー階層を作成した元のスレッドのみがそのビューにアクセスできる」というエラーが発生することです。onPostExecute で。これらのデバイスでは、問題は 100% 発生します。他のデバイスでは、問題なく動作します。
public final class MyAsyncTask extends AsyncTask<String, Integer, String>
{
private ProgressBar progress;
private ListActivity activity;
public MyAsyncTask(ListActivity activity, ProgressBar progress)
{
this.progress = progress;
this.activity = activity;
}
protected void onPreExecute()
{
this.progress.setVisibility(view.VISIBLE);
}
protected String doInBackground(String[] arg0)
{
// getting xml via httpClient
return string;
}
protected void onPostExecute(String result)
{
this.progress.setVisibility(view.GONE);
}
特定のデバイスの UI スレッドで onPostExecute が実行されない理由がわかりません。
次に、UI スレッドで確実に実行されるように、runOnUiThread で呼び出してみました。
runOnUiThread(new Runnable() {
@Override
public void run() {
ProgressBar progress = (ProgressBar)findViewById(R.id.some_view_progressbar);
MyAsyncTask task = new MyAsyncTask(activity, progress);
task.execute();
}
} );
これでも問題は解決しませんでした。同じ例外が引き続き発生します。
Log から、Thread.currentThread().getId() がハンドラー内のアプリのメイン アクティビティのスレッドと確かに異なることを確認しました。
私は立ち往生しています。アドバイスをいただければ幸いです。
注: 上記のサンプル コード (実際のコードではありません) を編集して、メソッド名の誤りと「戻り文字列」の欠落を修正しました。後でさらに情報を追加します。