1. 怎麼循環獲取非同步請求中回調函數的返回值
這問題不是這i么解的吧,非同步的回調函數,你獲取回調函數的返回值,時間不確定的。要加個標志位來判斷回調函數是否執行完畢。
2. 如何在java中獲取線程非同步執行之後的結果
java中提供了Future<V>介面和實現了Future介面的FutureTask<V> 類來將線程執行之後的結果返回(通過get()方法)。
1.Future<V>介面
Runnable介面執行任務是不返回任何值的,Runnable的run()方法的執行結果是void,而Future介面的call方法是有返回結果的,這是Runnable跟Future的區別之一,它們的另一個不同之處就是實現了Runnable介面的任務執行是調用ExecutorService的execute(Runnable task)方法,而實現了Future介面的任務是調用ExecutorService的submit(Future task)方法。調用Future的get()方法就能直接得到任務的返回值,該方法會一直阻塞直到任務的結果出來為止,我們可以調用Future的isDone()方法來判斷該任務的結果是否准備就緒。
[java] view plain
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class TestFuture {
public static void main(String[] args) throws InterruptedException, ExecutionException {
ExecutorService executor = Executors.newCachedThreadPool();
Future result1 = executor.submit(new Callable() {
@Override
public Integer call() throws Exception {
int sum = 0;
for (int i = 0; i < 10; i++) {
sum += i;
}
return sum;
}
});
Future result2 = executor.submit(new Callable() {
@Override
public Integer call() throws Exception {
int sum = 0;
for (int i = 10; i < 100; i++) {
sum += i;
}
return sum;
}
});
executor.shutdown();
System.out.println(result1.get() + result2.get());
}
}
2.FutureTask類
FutureTask實現了Future介面,將一個Callable實例作為參數傳給它,就能創建一個FutureTask實例,然後用ExecutorService的submit方法來執行這個實例。最後同樣是用get方法獲取線程執行後的結果。
[plain] view plain
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;
public class TestFutureTask {
public static void main(String[] args) throws InterruptedException, ExecutionException {
ExecutorService executor = Executors.newCachedThreadPool();
Callable task = new Callable() {
@Override
public String call() throws Exception {
return "結果";
}
};
FutureTask ft = new FutureTask(task);
executor.submit(ft);
System.out.println(ft.get());
executor.shutdown();
}
}empty
3. 怎麼在主調方法內獲取非同步請求的回調函數的返回值
簡單,並且處理很快,就在回調函數中直接處理即可,如果需要花費較長的時間,你就需要建立數據緩沖區,先將數據填入緩沖區,然後直接返回,同時建立單獨的線程來處理緩沖區的數據,這當中需要注意緩沖區的同步操作保護例如,你的界面程序調用通信模塊,在界面程序中設置了回調用來響應通信模塊中接收到的數據,在處理時將收到的數據顯示在界面上,對於數據量較少的情形,你直接在回調中將收到的數據拋出消息給主界面刷新即可;對於數據量很大的場合,你直接拋消息很可能會失敗,而且每次收到數據都觸發界面刷新會嚴重降低性能,那麼就需要先將數據填入緩沖區,主界面以定時讀取數據的方式來刷新另外,虛機團上產品團購,超級便宜
4. 如何獲取AsyncTask 非同步處理的返回值
你新建的類extends AsyncTask後要提供三個泛型參數,並且重載你需要的方法, 三個參數Params,Progress和Result,最後一個就是後台操作後可以返回的值,看例子 public class ProgressBarAsyncTask extends AsyncTask{ /** * 這里的String參數對