网络通话结束时Java同步返回

时间:2019-06-12 06:35:57

标签: java android synchronization retrofit2

我有一个方法class ptlistCell: UITableViewCell { @IBOutlet private weak var ptnameLbl: UILabel! @IBOutlet private weak var assignedmdLbl: UILabel! @IBOutlet private weak var officemdLbl: UILabel! @IBOutlet private weak var roomnumberLbl: UILabel! @IBOutlet private weak var seenoseeLbl: UILabel! @IBOutlet private weak var assigneddateLbl: UILabel! private var ptlist: PTList! override func awakeFromNib() { super.awakeFromNib() } func configureCell(ptlist: PTList) { ptnameLbl.text = ptlist.ptname assignedmdLbl.text = ptlist.assignedmd officemdLbl.text = ptlist.officemd roomnumberLbl.text = ptlist.room seenoseeLbl.text = ptlist.seenosee assigneddateLbl.text = ptlist.assigneddate } @IBAction func ptdataTapped(_ sender: Any) { } ,它期望返回一个Response对象。

intercept

@Override public Response intercept(Interceptor.Chain chain) throws IOException { Request original = chain.request(); mRequestBuilder = original.newBuilder(); mAgent.getToken(new OnTokenResponse() { @Override public void onSuccess(final String token) { mRequestBuilder.removeHeader(AUTHORIZATION); mRequestBuilder.header(AUTHORIZATION, "Bearer " + token); } @Override public void onFailure(final String error) { } }); Request request = mRequestBuilder.build(); return chain.proceed(request); } 进行网络调用,如果成功,则在onSuccess中返回一个字符串。反过来,我将其作为标头添加到mAgent.getToken()。 现在,网络调用将花费一些时间才能完成,我只想在网络调用完成(成功或失败)之后执行mRequestBuilder

如何同步此操作?

1 个答案:

答案 0 :(得分:-1)

  

我只想在之后执行请求request = mRequestBuilder.build()   网络通话已完成(成功或失败)。

     

如何同步此操作?

您可以等待(阻止)直到网络通话完成,或者在回调本身中执行request = mRequestBuilder.build();...

如果在主/ GUI线程上进行操作,则等待/阻止不是一个好主意。

在回调内运行代码可能也不是一个好主意,因为回调可能在某个网络线程中运行,并且您绝对不应在该线程上调用chain.proceed()

唯一的干净方法是在某个适当的时间点运行网络请求以首先获得结果,并且只有在该结果可用后才允许调用依赖于该结果的代码。

我故意在这里不提供有关如何阻止等待来自异步回调的信号的示例,因为如果它可能恰好在GUI线程上运行,则您实际上不应该使用这种阻止。