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

时间:2013-09-03 10:49:54

标签: android multithreading android-asynctask

enter image description here从Android 4.0开始我遇到了问题(在2.3.6上它正在运行)。

onProgressUpdate它应该已经在UI线程中。 我已经尝试activity.runOnUiThread现在使用Handler版本,ofc首先没有任何版本。怎么解决?

public class ReadDataTask extends AsyncTask<String, String, JSONArray> {

    private Activity activity;
    protected ProgressDialog dlg;

    private long startRead, endRead, endJson;

    public ReadDataTask(Activity activity) {
        this.activity = activity;
        dlg = new ProgressDialog(activity);
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        dlg.show();
        startRead = System.currentTimeMillis();
    }

    @Override
    protected void onProgressUpdate(String... values) {
        super.onProgressUpdate(values);
        if (values != null && values.length > 0) {
            final String msg = values[0];
            new Handler().post(new Runnable() {
                public void run() {
                    dlg.setMessage(msg);// android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
                }
            });
        }
    }


    @Override
    protected JSONArray doInBackground(String... params) {
           ... long task here
           publishProgress("Converting to JSON: " + (1 + i) + " / " + dataList.size());

3 个答案:

答案 0 :(得分:3)

仅在onPreExecute()中创建一个处理程序,它从UI线程调用并保存对它的引用,而不是在onProgressUpdate()中发布到它。

处理程序发布已创建的线程。

答案 1 :(得分:0)

谢谢大家! 解决方案的实施:

private Activity activity;
protected ProgressDialog dlg;
private Handler myHandler;

private long startRead, endRead, endJson;

public ReadDataTask(Activity activity) {
    this.activity = activity;
}

@Override
protected void onPreExecute() {
    super.onPreExecute();

    myHandler = new Handler();

    dlg = new ProgressDialog(activity);
    dlg.show();
    startRead = System.currentTimeMillis();
}

@Override
protected void onProgressUpdate(String... values) {
    super.onProgressUpdate(values);
    if (values != null && values.length > 0) {
        final String msg = values[0];
        myHandler.post(new Runnable() {
            public void run() {
                dlg.setMessage(msg);
            }
        });
    }
}

答案 2 :(得分:0)

以下对我有用。

myHandler.post(new Runnable() {
            public void run() {
                dlg.setMessage(msg);
            }
        });