2016-06-09 85 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中所要執行的任何操作。