Updating table from async task android

Posted by CantChooseUsernames on Stack Overflow See other posts from Stack Overflow or by CantChooseUsernames
Published on 2013-10-18T21:49:52Z Indexed on 2013/10/18 21:54 UTC
Read the original article Hit count: 141

I'm following this tutorial: http://huuah.com/android-progress-bar-and-thread-updating/ to learn how to make progress bars. I'm trying to show the progress bar on top of my activity and have it update the activity's table view in the background.

So I created an async task for the dialog that takes a callback:

package com.lib.bookworm;
import android.app.ProgressDialog;
import android.content.Context;
import android.os.AsyncTask;



public class UIThreadProgress extends AsyncTask<Void, Void, Void> {
    private UIThreadCallback callback = null;
    private ProgressDialog dialog = null;
    private int maxValue = 100, incAmount = 1;
    private Context context = null;

    public UIThreadProgress(Context context, UIThreadCallback callback) {
        this.context = context;
        this.callback = callback;
    }

    @Override
    protected Void doInBackground(Void... args) {
        while(this.callback.condition()) {
            this.callback.run();
            this.publishProgress();
        }
        return null;
    }

    @Override protected void onProgressUpdate(Void... values) {
        super.onProgressUpdate(values);
        dialog.incrementProgressBy(incAmount);
    };

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

        dialog = new ProgressDialog(context);
        dialog.setCancelable(true);
        dialog.setMessage("Loading...");
        dialog.setProgress(0);
        dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        dialog.setMax(maxValue);
        dialog.show();
    }

    @Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);

        if (this.dialog.isShowing()) {
            this.dialog.dismiss();
        }
        this.callback.onThreadFinish();
    }

}

And in my activity, I do:

final String page = htmlPage.substring(start, end).trim();

//Create new instance of the AsyncTask..

new UIThreadProgress(this, new UIThreadCallback() {

@Override
public void run() {
        row_id = makeTableRow(row_id, layout, params, matcher); //ADD a row to the table layout.
    }

    @Override
    public void onThreadFinish() {
        System.out.println("FINISHED!!");                       
    }

    @Override
    public boolean condition() {
        return matcher.find();
    }
}).execute();

So the above creates an async task to run to update a table layout activity while showing the progress bar that displays how much work has been done..

However, I get an error saying that only the thread that started the activity can update its views. I tried doing:

MainActivity.this.runOnUiThread(new Runnable() {
    @Override public void run() {
        row_id = makeTableRow(row_id, layout, params, matcher); //ADD a row to the table layout.
    }
}

But this gives me synchronization errors.. Any ideas how I can display progress and at the same time update my table in the background?

Currently my UI looks like:

enter image description here

© Stack Overflow or respective owner

Related posts about android

Related posts about multithreading