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() {
//
}
}
我想在onResponse方法的回调中指定“res”到“something”。在此代码中,无法在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); }
}
}
答案 0 :(得分:0)
您似乎无法理解回调的目的。将来某个时候会调用回调。现在不要。因此,设置回调的功能无法确保在执行结束时调用它。你想要什么永远不会奏效。相反,你应该在onPostExecute中执行你想要做的任何事情,并在回调体中使用该值。
答案 1 :(得分:0)
假设问题是由于变量必须被声明为final才能从回调中访问,您可以将其移出doInBackground方法并将其声明为exampleTask类的成员。
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中使用Callback是不错的做法,就像你尝试使用它一样。
如果你还需要在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回调方法之前,该值不存在,因此您必须等到它到达那里。您的代码正在 onResponse之前执行,因此该变量不可避免地为null。代码不是按顺序执行的。我建议学习回调以完全理解它们:)
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) {
//
}
});
}