0

ここに画像の説明を入力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());
4

3 に答える 3

3

UIスレッドから呼び出されるハンドラーonPreExecute()を1回だけ作成し、それへの参照を保存します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 に答える