Async Task OnProgressUpdate CalledFromWrongThreadException:只有创建视图层次结构的原始线程才能触及其视图

eas*_*ese 4 multithreading android android-asynctask

我正在使用AsyncTask下载一个带有progressdialog的数据库,该数据库显示了UI的进度.我的一些用户收到错误:

CalledFromWrongThreadException:只有创建视图层次结构的原始线程才能触及其视图.

据我所知,只有在尝试从UI线程更新Views时才会发生这种情况.这是错误:

com ... updateops.DbCreate.onProgressUpdate(DbCreate.java:70)at 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);
}
Run Code Online (Sandbox Code Playgroud)

它看起来像我正在遵循我应该做的事情,以避免这个错误.有人知道为什么会这样吗?

编辑:我还应该提到这段代码大部分时间都有效.我在Developer Console上收到崩溃报告.

Rob*_*bin 5

根据onProgressUpdate(Progress ...)在调用publishProgress(Progress ...)之后在UI线程上调用.

您应该分析整个日志报告,以检查是否有可能在其他线程上创建了异步任务.

如果您真的找不到根本原因,可以使用在UI线程上创建的处理程序来解决.