4

AsyncTask を使用して、UI に進行状況を示す進行状況ダイアログでデータベースをダウンロードしています。一部のユーザーがエラーを受け取ります:

CalledFromWrongThreadException: ビュー階層を作成した元のスレッドのみがそのビューにアクセスできます。

私が理解しているように、これは、UI スレッドからビューを更新しようとしている場合にのみ発生するはずです。エラーは次のとおりです。

com...updateops.DbCreate.onProgressUpdate(DbCreate.java:70) com...updateops.DbCreate.onProgressUpdate(DbCreate.java:1) で

ここに私のコードがあります:

public class DbCreate extends AsyncTask<String, String, String>{

private static Context mCtx;
private static ProgressDialog mDialog;
public static AmazonSimpleDBClient mSDbClient;
public static AmazonS3Client mS3Client;
private static int mAppVersion;
private static boolean mCreate;


public DbCreate(Context ctx, int versionCode, boolean create) {
    mCtx = ctx.getApplicationContext();
    mAppVersion = versionCode;
    mDialog = new ProgressDialog(ctx);
    mDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
    mDialog.setMessage("Checking for server access. Please wait...");
    mDialog.setCancelable(false);
    mDialog.setMax(1);
    mDialog.show(); 
    mCreate = create;

}

protected void onProgressUpdate(String... name) {
    if (name[0].equals("item")) {
        mDialog.incrementProgressBy(1);
    } else if (name[0].equals("setMax")) {
        mDialog.setProgress(0);
        mDialog.setMax(Integer.parseInt(name[1]));   <-- This is line 70
}}


@Override
protected String doInBackground(String... arg0) {
    **do stuff**
    publishProgress("setMax", ""+ 3);
}

このエラーを回避するために、私がすべきことを正確に実行しているように見えます。なぜそれが起こっているのか知っている人はいますか?

編集:このコードはほとんどの場合機能することにも言及する必要があります。開発者コンソールでクラッシュ レポートを受信して​​います。

4

4 に答える 4

5

onProgressUpdate(Progress...) によると、publishProgress(Progress...) への呼び出しの後に UI スレッドで呼び出されます。

ログ レポート全体を分析して、非同期タスクが他のスレッドで作成された可能性があるかどうかを確認する必要があります。

根本的な原因が本当に見つからない場合は、UI スレッドで作成されたハンドラーを使用して回避できます。

于 2013-09-04T00:47:22.730 に答える
1

あなたが説明しているのと同じ問題がありrunOnUiThread()、AsyncTask が所有するコンテキストに対する呼び出しを使用して修正しました (例にもあります)。

次の解決策で問題が解決するはずです。

    @Override
    protected void onProgressUpdate(final String... messages){
        myActivityReference.runOnUiThread(new Runnable() {
            @Override
            public void run() {          
                // Your UI changes here. 
           }
       });                 
    }

myAsyncTaskはもともと a 内から呼び出されていたことに注意してくださいAlertDialog。これが問題の原因であると私は信じています。

于 2014-10-17T14:33:25.613 に答える
1

あなたのコードは見栄えがよく、ほとんどの場合はうまくいくはずです。ハンドラーを使用することをお勧めします。UI スレッドでハンドラーを作成し、onProgressUpdate() から呼び出すことができます。これにより、UI 作業が UI スレッドで行われることが完全に保証されます。

これで問題は確実に修正されますが、最初にエラーが発生する理由はわかりません。この種の問題は以前にも見たことがありますが、具体的な理由はわかりませんでした。

于 2013-09-04T00:51:30.220 に答える