我正在使用 AsyncTask 下载一个带有在 UI 上显示进度的进度对话框的数据库。我的一些用户收到错误消息:

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

据我了解,只有在您尝试从 UI 线程更新 View 时才会发生这种情况。这是错误:

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);
}

在我看来,我正在完全按照我应该做的事情来避免这个错误。有谁知道为什么会这样?

编辑:我还应该提到这段代码大部分时间都有效。我在开发者控制台上收到崩溃报告。

最佳答案

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

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

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

关于android - 异步任务 OnProgressUpdate CalledFromWrongThreadException : Only the original thread that created a view hierarchy can touch its views,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18603460/

10-09 09:39