- 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];
}
1024-- 04.06.2014 16:45 # 0
0rt 04.06.2014 17:21 # +2
kovel 04.06.2014 17:23 # 0
0rt 04.06.2014 17:29 # 0
kovel 04.06.2014 17:43 # 0
roman-kashitsyn 04.06.2014 17:29 # +4
Ну и массив можно заменить каким-нибудь AtomicReference, если нет человеческого Executor-а.
kovel 04.06.2014 17:42 # 0
bormand 04.06.2014 18:26 # 0
На ведре для таких задачек есть прекрасный класс AsyncTask.
http://developer.android.com/reference/android/os/AsyncTask.html
WGH 04.06.2014 19:29 # 0
Только я так и не смог прикрутить к нему приоритеты.
Если поискать в интернете, можно найти "решения", в которых предлагается чуть ли не с нуля всё переписать.
bormand 04.06.2014 19:56 # 0
Да там вроде бы ради криворуких индусов даже "тредпул" ограничили одним тредом ;( Т.е. два асинктаска параллельно все равно работать не будут.
kovel 04.06.2014 22:04 # 0
bormand 05.06.2014 05:19 # 0
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.
roman-kashitsyn 05.06.2014 10:05 # +2
It's just so typical for Google.
Много потоков могут привести к ошибкам - нужно их запретить.
Исключения могут привести к ошибкам - нужно их запретить.
Код с бустом бывает сложным - нужно запретить использовать буст.
kovel 05.06.2014 11:41 # 0
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;
Ну да, и в самом деле как-то странно.
bormand 04.06.2014 20:02 # 0
А если просто набивать task'и в priority queue и по завершению таска дергать из нее следующий и запускать?
P.S. Хотя это и есть то самое "переписать руками" :)
kovel 04.06.2014 22:03 # 0