5

私は 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() がハンドラー内のアプリのメイン アクティビティのスレッドと確かに異なることを確認しました。

私は立ち往生しています。アドバイスをいただければ幸いです。

注: 上記のサンプル コード (実際のコードではありません) を編集して、メソッド名の誤りと「戻り文字列」の欠落を修正しました。後でさらに情報を追加します。

4

3 に答える 3

1

メインスレッドからのみ aysnctask.execute() を呼び出していることを確認してください。

于 2015-06-09T14:55:26.600 に答える
0

UI スレッドにハンドラーを記述し、onPostExecute からハンドラーを呼び出します。それは問題を解決します。

このようなもの。UI スレッド (メイン スレッド) にハンドラーを用意します。

handler = new Handler(){
    @Override
    public void handleMessage(Message msg) {
        //run on UI Thread
     }
}; 

次のように onPostExecute() を呼び出します。

 handler.sendEmptyMessage(MSG);
于 2013-08-28T02:23:41.870 に答える