0

在此处输入图像描述从 Android 4.0 开始,我遇到了问题(在 2.3.6 上它正在工作)。

onProgressUpdate它应该已经在 UI 线程中。我现在尝试activity.runOnUiThread的是一个Handler版本,ofc 首先是没有任何 tham。如何解决?

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());
4

3 回答 3

3

仅创建一次onPreExecute()从 UI 线程调用的处理程序并保存对它的引用,而不是在onProgressUpdate().

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

于 2013-09-03T11:08:36.317 回答
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);
            }
        });
    }
}
于 2013-09-03T11:14:26.630 回答
0

以下对我有用。

myHandler.post(new Runnable() {
            public void run() {
                dlg.setMessage(msg);
            }
        });
于 2017-02-27T07:53:03.310 回答