有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java AsyncTask处理另一个类接收到的消息并更新进度

我的问题是

我有一个工作正常的AsyncTask,在doInBackground()上它调用了一个新类,该类使用REST服务将我的数据同步到web服务。我没有一个唯一的类,因为我需要对不同的活动进行相同的内容同步,这样做更简单

我需要的是,在同步过程中,我可以获得“联系人”的数量,每次下载联系人时,从“联系人”长度中删除1个,因此,我需要在进度对话框中显示联系人的长度,并在每次下载新的“联系人”时刷新

以下是我的异步任务代码:

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) 个答案

  1. # 1 楼答案

    您需要为数据进度创建一个侦听器,并让它更新进度栏。现在看起来是这样的:

    syncData.syncData(context, authToken);
    

    在完成之前,不会向进度指示器提供任何更新。所以,你需要这样的东西:

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

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

    例如:

    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);
            }
        }
    }
    

    然后在这个例子中,您需要可运行的程序(startScan、scanComplete和updateScanProgress)来执行UI任务,比如更新进度条。在您的情况下,您可能还想加载一些结果,等等

    然后在你的任务中:

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

    假设SDScanListener类和AsyncTask都在您的活动中。此外,SyncData Cals需要在实例化时设置一个SDScanListener变量。然后,当它执行其工作时,会调用侦听器方法,如:

    scanListener.startScan();
    

    在进行过程中,它会调用其他方法(并传入相应的参数)