Java 如何在AsyncTask doInBackground()中返回异步操作的结果?
我想在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,
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;这怎么属于我的问题?