2016-06-09 115 views
0
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”,witch位于onResponse方法的回调中。在这段代码中,不可能在onResponse方法中分配res。将外部变量赋值给AsynckTask中的回调结果

请任何帮助,欢迎。

谢谢:)

我原来的代码:我想指定 “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

为什么这是不可能的?因为它不是最终的?您可以使用SomeResult的最终数组作弊并将数值分配到数组的第一行。 Android Studio应该为您提供此解决方案。 –

+0

你如何才能返回res'onResponse'你不需要存储它。 –

回答

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时,在你的情况下,你可能会有onPostExecute调用,然后再打回调函数的onRespons。我认为在你尝试使用它的方式中,在doInBackground中使用回调是不好的做法。

如果您需要在doInBackground中异步执行其他工作,请执行此操作,但将someMethod调用移动到onPostExecute并执行需要的任何操作。

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,所以变量不可避免地为空。代码不是按顺序执行的。我建议学习回调,以充分了解它们:)

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) { 
       // 
      } 
     }); 
} 
+0

@Gabe Sechan非常感谢Karen Forde的帮助。我试过你的解决方案,但仍然是空的:/请检查我的真实代码,我将编辑我的问题。谢谢 –

+0

@Aymane如上所述,res会在onResponse之外为空,因为它在调用onResponse之前获取到那段代码。我将用你应该使用的流程编辑这个答案 –

+0

@AmaneneBo请参阅编辑,希望它有帮助 –

0

您似乎不理解回调的目的。回调在未来某个时候会被调用。不是现在。所以设置回调的函数在执行结束时不能保证它被调用。你想要的东西永远不会工作。相反,您应该在回调的主体中执行onPostExecute中所要执行的任何操作。