我的问题是这个;
我有一个工作正常的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和数据库内容的函数......
任何人都可以帮忙吗?
答案 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();
当它进展时,它会调用其他方法(并传入相应的参数)。