将外部变量分配给 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) {
                //
            }
        });
}