Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/230.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在AsyncTask doInBackground()中返回异步操作的结果?_Java_Android_Multithreading_Android Asynctask - Fatal编程技术网

Java 如何在AsyncTask doInBackground()中返回异步操作的结果?

Java 如何在AsyncTask doInBackground()中返回异步操作的结果?,java,android,multithreading,android-asynctask,Java,Android,Multithreading,Android Asynctask,我想在AsyncTask的doInBackground块中进行服务器请求调用 问题是,我的服务器调用是由一个使用回调的异步函数执行的 private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> { protected Long doInBackground(URL... urls) { ServerLoader.getSharedInstance().get(url,

我想在AsyncTask的doInBackground块中进行服务器请求调用

问题是,我的服务器调用是由一个使用回调的异步函数执行的

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {

     protected Long doInBackground(URL... urls) {

        ServerLoader.getSharedInstance().get(url, 
            new new AsyncCallback<GetResult<Long>>() {

            @Override
            public void onFailure(Exception e) {
            }

            @Override
            public void onSuccess(GetResult<Long> result) {
              Long myResult = result.getValue();
            }

        );

        // return ??; How do I make the return?
     }

 }

如何从异步函数调用中获取返回值?

onPostExecute是AsyncTask将代码发布到UI的地方,如果这是您所要求的

new DownloadImageTask().execute("http://example.com/image.png");


private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
 protected Bitmap doInBackground(String... urls) {
     return loadImageFromNetwork(urls[0]);
 }

 protected void onPostExecute(Bitmap result) {
     // set image for ImageView
     mImageView.setImageBitmap(result);
 }

}

看看这个模式,它帮助我理解异步任务

由于您的服务器调用已经以异步方式执行,您不需要在doInBackground中调用它,只需使用服务器通信解决方案提供的功能即可

如果您试图用结果数据更新UI元素并从主线程获取必须调用的结果,则需要手动将结果处理逻辑发布到UI AKA主线程,如下所示:

ServerLoader.getSharedInstance().get(url, 
    new new AsyncCallback<GetResult<Long>>() {

    @Override
    public void onFailure(Exception e) {
    }

    @Override
    public void onSuccess(GetResult<Long> result) {
        final Long myResult = result.getValue();
        // .post() on a view is what sends stuff to UI thread
        txtView.post(new Runnable(){
            public void run(){
                txtView.setText("" + myResult);
            }
        });
    }
);
private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
    protected CountDownLatch mLatch = null;
    protected Long mResult = null;
    protected Long doInBackground(URL... urls) {
        if (urls == null || urls.length = 0) {
            return null;
        }

        mLatch = new CountDownLatch(1);

        ServerLoader.getSharedInstance().get(url[0], 
            new new AsyncCallback<GetResult<Long>>() {

            @Override
            public void onFailure(Exception e) {
                // leave the result null
                mLatch.countDown();
            }

            @Override
            public void onSuccess(GetResult<Long> result) {
                mResult = result.getValue();
                mLatch.countDown();
            }

        );

        // the thread that DownloadFilesTask.doInBackground()
        // gets executed on will wait till it hears from ServerLoader
        mLatch.await();
        return mResult;
    }

    protected void onPostExecute(Long result) {
        // here you get the result
    }

}

不要使用asynctask,那么,您的调用已经在后台线程上播放。我需要在后台线程上完成,并在调用后更新UI。是。这就是你回拨的目的。这如何回答我的问题?你不需要这个任务。在UI线程上调用ServerLoader方法,它将负责进行异步调用,并将UI内容放入onSuccessGetResult中。另外,您可以询问编写ServerLoader类的人。我希望在我第一次学习AsyncTask时有人向我展示这一点。这是真的,但这并不能回答我关于如何在onInBackground中同步async方法的问题?我想您必须使用get来同步它。尝试此ClassExtendAsyncTask.execute.get;这怎么属于我的问题?