- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
public String getCurrentUrl() {
if (webview == null) {
throw new SelendroidException("No open web view.");
}
long end = System.currentTimeMillis() + UI_TIMEOUT;
final String[] url = new String[1];
done = false;
Runnable r = new Runnable() {
public void run() {
url[0] = webview.getUrl();
synchronized (this) {
this.notify();
}
}
};
runSynchronously(r, UI_TIMEOUT);
return url[0];
}
Ну и массив можно заменить каким-нибудь AtomicReference, если нет человеческого Executor-а.
На ведре для таких задачек есть прекрасный класс AsyncTask.
http://developer.android.com/reference/android/os/AsyncTask.html
Только я так и не смог прикрутить к нему приоритеты.
Если поискать в интернете, можно найти "решения", в которых предлагается чуть ли не с нуля всё переписать.
Да там вроде бы ради криворуких индусов даже "тредпул" ограничили одним тредом ;( Т.е. два асинктаска параллельно все равно работать не будут.
When first introduced, AsyncTasks were executed serially on a single background thread. Starting with DONUT, this was changed to a pool of threads allowing multiple tasks to operate in parallel. Starting with HONEYCOMB, tasks are executed on a single thread to avoid common application errors caused by parallel execution.
It's just so typical for Google.
Много потоков могут привести к ошибкам - нужно их запретить.
Исключения могут привести к ошибкам - нужно их запретить.
Код с бустом бывает сложным - нужно запретить использовать буст.
private static final String LOG_TAG = "AsyncTask";
private static final int CPU_COUNT = Runtime.getRuntime().availableProcessors ();
private static final int CORE_POOL_SIZE = CPU_COUNT + 1;
private static final int MAXIMUM_POOL_SIZE = CPU_COUNT * 2 + 1;
private static final int KEEP_ALIVE = 1;
Ну да, и в самом деле как-то странно.
А если просто набивать task'и в priority queue и по завершению таска дергать из нее следующий и запускать?
P.S. Хотя это и есть то самое "переписать руками" :)