将外部变量分配给 AsynckTask 内部回调的结果
assign external variable to the result of a callback inside AsynckTask
private class exampleTask extends AsyncTask<String, Void, SomeResult>{
@Override
protected SomeResult doInBackground(String... urls) {
SomeResult res ;
someMethod(new CallBack<T>(){
@Override
public void onResponse(SomeResult something) {
res = something ;
}
@Override
public void onFailure() {
//
}
});
return res ;
}
@Override
protected void onPostExecute() {
//
}
}
我想将 "res" 分配给 "something" 在 onResponse 方法的回调中。在此代码中,不可能在 onResponse 方法内分配 res。
欢迎任何帮助。
谢谢:)
我的原始代码:我想分配 "url" ;
private class GetBeaconInfosTask extends AsyncTask<String, Void, Call<Url>> {
Url url ;
@Override
protected Call<Url> doInBackground(String... urls) {
ProxService service = ProxService.Factory.makeProxService(ProxService.ENDPOINT);
return service.getUrlDetails(urls[0]);
}
// onPostExecute return the results of the AsyncTask.
@Override
protected void onPostExecute(Call<Url> call) {
call.enqueue(new Callback<Url>() {
@Override
public void onResponse(Call<Url> call, Response<Url> response) {
url = response.body();
}
@Override
public void onFailure(Call<Url> call, Throwable t) {
//
}
});
if(url == null){
Log.i("url is null", "url is null !!!!! ....");
}
else {
setShopLogo(url.icon) ;
setShopName(url.title);
setDescription(url.description);
setlongUrl(url.longUrl); }
}
}
你似乎没有理解回调的目的。在将来的某个时间调用回调。现在不要。因此,设置回调的函数将无法保证在执行结束时会被调用。你想要的永远不会奏效。相反,您应该在回调正文中使用该值在 onPostExecute 中执行您想执行的任何操作。
假设问题是由于必须将变量声明为 final 才能从回调中访问,您可以将其移出 doInBackground 方法并将其声明为 exampleTask class 的成员。
private class exampleTask extends AsyncTask<String, Void, SomeResult>{
SomeResult res;
@Override
protected SomeResult doInBackground(String... urls) {
someMethod(new CallBack<T>(){
@Override
public void onResponse(SomeResult something) {
res = something ;
}
@Override
public void onFailure() {
//
}
});
return res ;
}
@Override
protected void onPostExecute() {
//
}
}
虽然这应该可以回答您的问题,但很难说出您要实现的目标。除了@Gabe Sechan 的回答——您的变量可能永远不会被分配,或者它会在一定时间后被分配。通常,您会在 doInBackground 中执行工作,并在执行后调用 onPostExecute,但在您的情况下,您可能会在点击回调的 onRespons 之前调用 onPostExecute。我不认为以您尝试使用它的方式在 doInBackground 中使用回调是一种好习惯。
如果您有其他需要在 doInBackground 中异步执行的工作,请执行此操作,但将 someMethod 调用移至 onPostExecute 并在其中使用 res 执行您需要执行的任何操作。
private class exampleTask extends AsyncTask<String, Void, SomeResult>{
SomeResult res;
@Override
protected SomeResult doInBackground(String... urls) {
// background work
}
@Override
protected void onPostExecute() {
someMethod(new CallBack<T>(){
@Override
public void onResponse(SomeResult something) {
res = something ;
// DO STUFF WITH RES HERE AFTER IT'S BEEN ASSIGNED OR YOU WON'T HAVE ACCESS TO IT
}
@Override
public void onFailure() {
//
}
});
}
}
编辑:既然问题包含真实代码,我可以提供适合您的流程。请注意,在我粘贴在 onResponse 注释上方的代码中,说明这是您应该拥有使用该变量的代码的地方。使用您的代码查看下面的 onResponse 示例。该值在您到达 onResponse 回调方法之前不存在,因此您必须等到它到达那里。您下面的代码正在 before onResponse 执行,因此变量不可避免地为空。代码不是按顺序执行的。我建议研究回调以充分理解它们:)
private class GetBeaconInfosTask extends AsyncTask<String, Void, Call<Url>> {
Url url ;
@Override
protected Call<Url> doInBackground(String... urls) {
ProxService service = ProxService.Factory.makeProxService(ProxService.ENDPOINT);
return service.getUrlDetails(urls[0]);
}
// onPostExecute return the results of the AsyncTask.
@Override
protected void onPostExecute(Call<Url> call) {
call.enqueue(new Callback<Url>() {
@Override
public void onResponse(Call<Url> call, Response<Url> response) {
url = response.body();
setShopLogo(url.icon) ;
setShopName(url.title);
setDescription(url.description);
setlongUrl(url.longUrl); }
}
@Override
public void onFailure(Call<Url> call, Throwable t) {
//
}
});
}
private class exampleTask extends AsyncTask<String, Void, SomeResult>{
@Override
protected SomeResult doInBackground(String... urls) {
SomeResult res ;
someMethod(new CallBack<T>(){
@Override
public void onResponse(SomeResult something) {
res = something ;
}
@Override
public void onFailure() {
//
}
});
return res ;
}
@Override
protected void onPostExecute() {
//
}
}
我想将 "res" 分配给 "something" 在 onResponse 方法的回调中。在此代码中,不可能在 onResponse 方法内分配 res。
欢迎任何帮助。
谢谢:)
我的原始代码:我想分配 "url" ;
private class GetBeaconInfosTask extends AsyncTask<String, Void, Call<Url>> {
Url url ;
@Override
protected Call<Url> doInBackground(String... urls) {
ProxService service = ProxService.Factory.makeProxService(ProxService.ENDPOINT);
return service.getUrlDetails(urls[0]);
}
// onPostExecute return the results of the AsyncTask.
@Override
protected void onPostExecute(Call<Url> call) {
call.enqueue(new Callback<Url>() {
@Override
public void onResponse(Call<Url> call, Response<Url> response) {
url = response.body();
}
@Override
public void onFailure(Call<Url> call, Throwable t) {
//
}
});
if(url == null){
Log.i("url is null", "url is null !!!!! ....");
}
else {
setShopLogo(url.icon) ;
setShopName(url.title);
setDescription(url.description);
setlongUrl(url.longUrl); }
}
}
你似乎没有理解回调的目的。在将来的某个时间调用回调。现在不要。因此,设置回调的函数将无法保证在执行结束时会被调用。你想要的永远不会奏效。相反,您应该在回调正文中使用该值在 onPostExecute 中执行您想执行的任何操作。
假设问题是由于必须将变量声明为 final 才能从回调中访问,您可以将其移出 doInBackground 方法并将其声明为 exampleTask class 的成员。
private class exampleTask extends AsyncTask<String, Void, SomeResult>{
SomeResult res;
@Override
protected SomeResult doInBackground(String... urls) {
someMethod(new CallBack<T>(){
@Override
public void onResponse(SomeResult something) {
res = something ;
}
@Override
public void onFailure() {
//
}
});
return res ;
}
@Override
protected void onPostExecute() {
//
}
}
虽然这应该可以回答您的问题,但很难说出您要实现的目标。除了@Gabe Sechan 的回答——您的变量可能永远不会被分配,或者它会在一定时间后被分配。通常,您会在 doInBackground 中执行工作,并在执行后调用 onPostExecute,但在您的情况下,您可能会在点击回调的 onRespons 之前调用 onPostExecute。我不认为以您尝试使用它的方式在 doInBackground 中使用回调是一种好习惯。
如果您有其他需要在 doInBackground 中异步执行的工作,请执行此操作,但将 someMethod 调用移至 onPostExecute 并在其中使用 res 执行您需要执行的任何操作。
private class exampleTask extends AsyncTask<String, Void, SomeResult>{
SomeResult res;
@Override
protected SomeResult doInBackground(String... urls) {
// background work
}
@Override
protected void onPostExecute() {
someMethod(new CallBack<T>(){
@Override
public void onResponse(SomeResult something) {
res = something ;
// DO STUFF WITH RES HERE AFTER IT'S BEEN ASSIGNED OR YOU WON'T HAVE ACCESS TO IT
}
@Override
public void onFailure() {
//
}
});
}
}
编辑:既然问题包含真实代码,我可以提供适合您的流程。请注意,在我粘贴在 onResponse 注释上方的代码中,说明这是您应该拥有使用该变量的代码的地方。使用您的代码查看下面的 onResponse 示例。该值在您到达 onResponse 回调方法之前不存在,因此您必须等到它到达那里。您下面的代码正在 before onResponse 执行,因此变量不可避免地为空。代码不是按顺序执行的。我建议研究回调以充分理解它们:)
private class GetBeaconInfosTask extends AsyncTask<String, Void, Call<Url>> {
Url url ;
@Override
protected Call<Url> doInBackground(String... urls) {
ProxService service = ProxService.Factory.makeProxService(ProxService.ENDPOINT);
return service.getUrlDetails(urls[0]);
}
// onPostExecute return the results of the AsyncTask.
@Override
protected void onPostExecute(Call<Url> call) {
call.enqueue(new Callback<Url>() {
@Override
public void onResponse(Call<Url> call, Response<Url> response) {
url = response.body();
setShopLogo(url.icon) ;
setShopName(url.title);
setDescription(url.description);
setlongUrl(url.longUrl); }
}
@Override
public void onFailure(Call<Url> call, Throwable t) {
//
}
});
}