异步任务处理另一个类接收的消息并更新进度

时间:2014-04-04 10:54:51

标签: java android android-asynctask handler

我的问题是这个;

我有一个工作正常的AsyncTask,并且在doInBackground()上它调用了一个新类,它使用REST服务将我的数据同步到一个Web服务,我没有把所有东西都放在一个独特的类上,因为我需要相同的不同活动的内容同步,这种方式更容易。

我需要的是,在同步程序中,我可以获得"联系人"每次下载联系人时,都会从"联系人中删除1" lenght,所以,我希望在进度对话框中显示每次下载新的"联系"

时的联系和刷新的长度

是我的AsyncTask代码:

public class syncContentTask extends AsyncTask<String, String, Boolean> {

private ProgressDialog mprogress;
private Context context;

//token for JSON header to authenticate
String authToken;

public syncContentTask(Context cxt, String token) {
    this.context = cxt;
    mprogress = new ProgressDialog(context);
    authToken = token;
}

protected void onPreExecute() {
    mprogress = ProgressDialog.show(context, "Sync", "Sync in progress...");
}

@Override
protected Boolean doInBackground(String... params) {
    syncData syncData = new syncData();
    syncData.syncData(context, authToken);
    publishProgress(progress);
    return true;
}

protected void onProgressUpdate(String... progress) {
    //mprogress.setProgress(Integer.parseInt(progress[0]));
}

protected void onPostExecute(Boolean result) {
    if (result) {
        mprogress.dismiss();
    }
}

}

在Sync Data类中,我有处理HttpRequest和数据库内容的函数......

任何人都可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

您需要为数据进度创建一个侦听器并让它更新进度条。现在它看起来像这一行:

syncData.syncData(context, authToken);
在完成之前,

阻止并且不会向您的进度指示器提供更新。所以,你需要这样的东西:

MyListener listener = new MyListener(context);
SyncData syncData = new syncData(listener);

在您的监听器中,您的syncData类会在下载过程中调用myListener.downloadStarted()myListener.updateProgressBar(int progress)myListener.downloadCompleted()等回调方法。

例如:

public abstract class SDScanAdapter implements SDScanListener {
    public void startScan() {
    }
    public void updateScanProgress(int scanItemsTotal, int scanItemsCompleted) {
    }
    public void scanComplete() {
    }
}

然后创建一个监听器类:

public class ScanListener extends SDScanAdapter {
    @Override
    public void scanComplete(String contactName, String action) {
        runOnUiThread(scanComplete);
    }

    @Override
    public void startScan() {
        runOnUiThread(startScan);
    }

    @Override
    public void updateScanProgress(int scanItemsTotal,
            int scanItemsCompleted) {
        if (scanCountTotal != scanItemsTotal) {
            scanCountTotal = scanItemsTotal;
            progressBar.setMax(scanCountTotal);
        }
        if (scanCountUpdate != scanItemsCompleted) {
            scanCountUpdate = scanItemsCompleted;
            runOnUiThread(updateScanProgress);
        }
    }
}

然后,对于此示例,您需要执行UI任务的Runnables(startScan,scanComplete和updateScanProgress),例如更新进度条。在您的情况下,您可能还想加载一些结果等。

然后在您的AsyncTask中执行:

ScanListener listener = new ScanListener();
SyncData syncData = new syncData(listener);

假设SDScanListener类和AsyncTask都在您的Activity中。此外,您的SyncData calss需要具有在实例化时设置的SDScanListener变量。然后,当它完成它的工作时,调用侦听器方法,如:

scanListener.startScan();

当它进展时,它会调用其他方法(并传入相应的参数)。