我正在使用com.birbit:android-priority-jobqueue:1.3.5
将数据发送到服务器。这里是如何。
@Override
public void onRun() throws Throwable {
MyStuff myStuff = getMyStuffFromContentProvider(mDbId);
SendAfterPhotosCallback callback = new SendAfterPhotosCallback() {…}
callback.xDone=false;
callback.yDone=false;
callback.zDone=false;
sendPhotosXToAmazonS3UsingTransferUtility(myStuff,callback);
sendPhotosYToAmazonS3UsingTransferUtility(myStuff,callback);
sendPhotosZToAmazonS3UsingTransferUtility(myStuff,callback);
//callback.sendJson(myStuff);
}
有什么大不了的?sendJson
必须在其他三个方法完成工作后调用。但是 TransferUtility 将数据异步发送到 S3。因此,为了跟踪每一项-ToAmazonS3UsingTransferUtility
是否成功,我使用 AtomicInteger 来计算每一项的完成情况TransferObserver
。
public static abstract class SendAfterPhotosCallback{
static boolean xDone = false;
static boolean yDone = false;
static boolean zDone = false;
abstract public void sendJson(MyStuff myStuff) throws Throwable;
}
当每个-ToAmazonS3UsingTransferUtility
都完成后,它将其各自的标志设置为 true(即callback.xDone=true
),然后调用callback.sendJson(myStuff)
. 在里面sendJson
我检查是否所有的标志都设置为然后将 json 发送到服务器。
无论如何,由于每个-ToAmazonS3UsingTransferUtility
都会callback.sendJson(myStuff)
异步调用,如果callback.sendJson(myStuff)
抛出异常会发生什么?作业队列的会onRun()
看到吗?
这很重要,因为当onRun
抛出异常时,JobQueue 知道稍后重试。
据我所知onRun
,在进行异步调用时已完成运行。那么如何解决这个问题,让代码运行良好呢?有没有办法让 TransferUtility 同步工作?