将外部变量分配给AsynckTask内部的回调结果

时间:2016-06-09 13:13:12

标签: java android android-asynctask callback asynccallback

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); }
    }

}

2 个答案:

答案 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) {
                //
            }
        });
}