From baf2da5bdaba2fd0d73fcc6f8e4c1648e55cb612 Mon Sep 17 00:00:00 2001 From: Sam Bosley Date: Tue, 14 Feb 2012 12:17:52 -0800 Subject: [PATCH] Moved task actions loading into its own thread --- astrid/res/drawable/action_web.png | Bin 726 -> 7919 bytes .../todoroo/astrid/adapter/TaskAdapter.java | 56 +++++++++++++++--- 2 files changed, 49 insertions(+), 7 deletions(-) diff --git a/astrid/res/drawable/action_web.png b/astrid/res/drawable/action_web.png index 2926d1f90112cd6fc6a12ca407aacc892cbd689b..7faa4c18584125a563ae1023afee7040a99b78bf 100644 GIT binary patch literal 7919 zcmeHMcTkhr*OsCny-GlY5EKM~gwP@ME=8&!O+tteN)kfoiiF3~AZgSHx)KtPneJjhH!52A-v zMLMFid~rx)UwspVuQNi%9;B#11@o3A0=OdaaGwq3B2ZxjL{bbWAtoXw0hNS`3jv`Jh%^`?1r~z{i%QEvBxJ=! zfj?g$1u7s6XMaQ1NKNA>9dRTNa>V1YvS6^6mzRi_mc#OLv2K(2M zf0&Qsf2GvM;t}FR-tU6`5ldVZ;&`&|czf`#9>?LwdHTWr$Ao3gkaos+IR1EHKSlV1 zR94vo?})*<8(`c~-{m6OzpDs@*&}3stmSz4Lsn%M{EyL(p$qD}ma;Bzw1YgzTi70X z1McC12Z4V^fWIsMdk75tXTb0H2pkfQ$KZY;Fh;ulnLxoAg+sZx0Nsgs@kRS!JYmPE zE~sBQevdll_!aa!2_A)aLHSq^KdvDZ0)uw{E9&3Tj;a4c z1^bWqrtZYs)C7rhb^phc_!}Yr78~|!ImoL1P*)X0ygd+jZS)PyarOV%2c>L}Q}@Qh z?Qy@~9sk>|io*N+z14`=P>##yZ_o`87<*#%{;2D}0LSD04%`IkVuryHTgzX@s=LBb z|Cikq_q+92#vjT1r7sY(@#8mQzah3d@E^VIN1A?irT^OHSgrpW`cL40N&b<-|H}2R zT>nUcf8_jcb^R;XKT_ZyIsaQ-|8H_p{pYlVL=%rlUc|Fd8+WPSi4%+>+G@%s-V;^# zPn%pta&>_BNFu|}iU37`f&}W#x+tC87!9YG0{(0l&a;}%uXAw|c`vW7>ZZ8oR_K=K z^2tB0i?&|J?ZmqKZUuwU~3kvqgdaNaSd|ERt%E@_NkDU!<<>YipQ@AxzXqX*(tAFvu z-L{<%AF|F$x&XXpnhEvG{pqDXn{Q+eEk3Ocmt<`n`@zGE;-?{%F15d-7)R9VU3Ox5D|%mzk_f} zn-v&6+Dh3mt|&7ZKkDUtwIHoG5RHnG_gZDA7-oErp^B zW_F5XGrB4a8lL*?^35tOuaA~e7lqjRik#{N)mw(Ry9KRGn8!p%SH*J5*lkSK^taj; zISm))-CJfEAHOwf?bX}5}(vYHZC=<4dH&%$i?7lW!B$X1d_+^@ok}i-YRCl5b z-gXwSqFD$oZ=Mu_R9`KzxBytB7HBgc^I9J%dBO~^Jgv&z(rf_zz{=ho9uXmsf4#|H zK)DQ9b~5pD*OcI(xG22e_~o9PJwC=%*kN$HtZBUTK)X9T)H=A#Mr@PVaub4h)$A}7Z<~}zpfCN&1hfl{2fr!h`XQVk)P}b_e_IpENB$}jM zo~9K^n%jc5=7x@rD??#)=jtB_$bJ1dbj6rp#U# zd7ZSp*!A%g#JtI}cQr;EzlfjGiZM;5oN$V{Yn{52jo2flt5$v-SBreonkZl_1VUz> zYPF*zyUSQ&tG5t8p1tM0soY6{E0Lmx_3t~W9cXr;Jl>6o(kqZ-(SBP~PZcSQ+My}~ z$wBq$m#x^A8zB8HpVmjcE;#q@O_5)WwflOmYm*6dB;7H-;H7yjcE;sGM~zaT1N9mQ zLhf#SysZHBW!eH?Ztv%p4i*cT80i8{^vrY4^t_ImJ_qmvbjIP(tfxer2eR5_;AgeQ z2H2Dbe7c=op?hv>YR|1wCsmr4$f8K2W#UA4b8~Z#80~5xVL#nZ+zF_sj=13r{9NWWJb;jhQ zXce`lW^CVfHaYTsh`TjmGRX3Y%YLHn6fMP7r9qeHz?l87(uzT!ZuU4k2h0I7J~FaD zonySJy=*|G+ivL*1btYws9MifyKhVb_Q~3c@xj=m5JQfNkpxXDPHKb|D+bh18L;Ct*}&L5Yy{vQgf4iN87}yJekT(X-OKV= zulz$Fo%)rh@yOaoXcp;S9v$kgLHj~yD^JhQ^8hyL2xgh|$i&ZWj@Kncz=p8t^R4~i zRrf1l{8e=NG}Y%aP?2+?BYc5U#w2GZUVyGsd2!@vN9#WzqqtBY#d(J@B_*YBtsFal zUFj2A(`aKo)iNsUCHd~~j0PJg`wI?3zDn{ap7xg9P(Xt?h2YrPG1Fa!gsZymD1`bL zo{kO<4o-my{tRg%=XVZZ$18sdx_d$}N z2Jnr+;sikKp~n*AFy4AJwQ5!dUxqRMctHAIzj)b!B~nQPr&C155(?M4MqgHYeuLjDvi{p~9P?t;3JrxGeyH7ta9hvimFD-VsLY`M3eQ&{zrYm`eFOAXCS z$EH21iR5o^#ln8`QH6*X>phUHlsSrKb}lPrUsgFOGcrAsnNc;olosW8{`RfI&$kk) zcIW*70;w&n#BvUctuWBwtx+6uB9n_C6qahO&xI<6Ry|9rPbp^Tnjk)|?<@C<#U|h2 z-`R6c*SjMXy~3}2+bkdFy)o>g9un8ccpOFX5@F z>R!?|6I+{t<|i9yQ3U6hgvO^@%3-?v^MahgXuH9WEz#P*Bo85 z{8=d~+=}I=Rbg7$){t=Yvu&L?JLO`R9BiYn7mT}gpB}O~tp+@)etPkyX(Jff8pJmd z7{1A-T#a&*6dWb2(Ddy}MdB`HLK+EohaldhPjvbHq9C>Isdn9 z_MTT5Sy@?a2Qgf6_hRV-9dN>T1nUwhN8KPBQSh%3`d*yct@{GG-r9B&ajJdL9ABp8 zX`XK7{9#ezp5}}cPI%$Q^NtnQX2%n2-WGP5G$$^cy@74lOiHKO&rgvn>LQE7s_RcD z(b5{QBnhe~pX6OJk(2EYK{tn%C)G&;+HzMEvM+Y{#0;lK_YQlppU|fNEn7OTFJM4EM*FzP4pgI-_B=LXex?^Q}MO}@5ftCIB0dH*Tgr^4ZN z-_0(i{3YHU2Nh@;-Yk#ct;zanv5yJQ+;0I6rwe9w zeTHlY?V*ov*OK>$6JL|ur6tGTsP0-+=P|^3^_KYG6kxnfD zQRq2mP}J0qqk0}^>tbG}h%GB@akaw~aV>&6^6?S(ZL?3#25tn;vZWLmavjYkmu~m% zCfh$@;MZUAmk06!1|~RBIyz6p)aJxRtOBE}*~em8^6ts!ZLcOPScH5cZo$&KI~=0N z$7&ThI&)55G_K%u!c)x$t% zsU5@!duVzMuEkbK+2?(ZU&tVG>cvv4ud|i&n#Y^2*^(}P;o4@O?WKTAiim8c$Cq@m zh{Yrr3aV|spU4-(ghP?i&2`X&@`!iL3YO1q?&CQ{GE{p-ubFIx#GH<81XC=juW1Ye zF1Tlk)t=RDzm@!+t=E|9QEIs5jr5nGyAfU5(GlCRTq&t~r)-iJ>e3g_Qu@f>6I2IP zzB<%m^U=ZDJ|WdGh$FpYZNzm_X$Ov>hK?&YW{mke>pZiknqQh5c){?9D@sw9T*2^6 zmE+_S*NwGzm!E#C_gHswEOG?pbtlw$5oXUX*Dce2SuZ7>9p+tq;}NbP%*&gdKFjIO zHuP+7MVq3diNAd?HoUM&ATai5%io_cGwF}g#b z;nr0acJ8d@3_jjwTQyzXmnt%a@&v!UT+xX)a&e;=7O7p2rJLln-r?Q}OJ<_4J=ASZ z6>10otDwd_7zULJ?hpO~el8Dx^L)W$#7C~nG-Z1*9baw`8KZ^T{T3OxN194Xt0;Y! zJn`A=ZU_#7&a;W*={*!-78=4yuX&OzN6{>#%GxF{HVC{95={k=zYZ1DQaUIl&sL*b z+g_1~uVW0d31e1G3RzfKh|`Sa^l75Z7xjHu5N@ktCS;gh-1)&-_+S5Nh>9+c=^tH&kKb3yvPqX}SW{Iid+9l#Jx*cCoLK7~iln@?KjZPeImMJ0H6;2>71i2No> z0=4!eg++XqO-8dN%1Eb{#pu2VUQ`p7LN<-& zPSOGBTKiWS%JigpR>s%S(zXvr8?uATxf$L|*T#n%Yv+iPb3UVV6B!CWeKk(RqUs`5 z;6eGeA+tQ<`RzluJLA&DhoTiw$iuMrWD=O=zO-}`HlRoS1~uJ~1`rcRsJS9eg1Sip z^;eY)oS&aBoy9Zg<86)NM6H5{raw$&-LvWLrPyL)UGfo>R5PX?DU;&5SR0?|R(zP^ z$G=rGZO`81vl|jUq%zAYn|cKW1sJ{QRqe*g0N*SXfGS4NZ}xUNmRh>$7e_3}pcod;hl!%!qx`+}()-nvUF4WSOM`6F(KKdZ1C#|}#o?txk3xAkR3QkoM^++Pam)6>p> Q{|j1MU0?07if!Qk0E);=ApigX delta 701 zcmV;u0z&=oJ=O&-iBL{Q4GJ0x0000DNk~Le0000G0000G2nGNE03Y-JVE_OC0drDE zLIAGL9O;oECw~HKNklaQ-vz^SqZC@$vB?v`kJ; z>Lk;WKa#f}xaOWt8w)^)dcEFZY;4RuGc)rZ2n3p2TYp`ueJ{SS(%{*pPu(Utfpc@5k!uD!g7VJRT3+ZZ~FUXW{et8jPhz8N9r_h>?*I zS1=g-%S;s0Bp#2e%vuAd(+Qi+#;O|BD1+hQVg1C!ME&;mw#AI8R0{k1`;ZybdU<&n z3kwUFn}3^wY(W{=?RLmk-l-KsLqo2;y}icM(-VrtA|4+fadUH{*xcO2;^HFa=jT=V z4u=DBkQ8&jNv#+h9L$wUrSDp;2J-OmprFC-?k;=&m7Q&DZ*OB~XQxH2Fq_TKM@L5} zm&>@jyTkqceFuK$^LaHumd)&J>-zc{)oK;gihut8{%4lP{tgZf)S;HEt1CnzkxuE+ zXcU!71=(yC)QY~oz8uS%nwnAr3WY+-y$ypoRQ7GPT9Hg9ad~;k|8HtVZ*T9k{58kN z$3Y`HGoVeOP(UmeQ(|86#l;13xg6JD)C!}~s2dm<;0r@I99D-~&d<-0$z;?m93CFx z?0@VG>2$g!%db-_2b-|^>uoBivMwPa-vMyjE;_eQllP{oT{R`yW1;GK97%& znL)vcYvFA%hOyKrgG3_Hp{uLQZ8Dka^5J~R$Mr4GK)B`}&luCzC taskDetailLoader = Collections.synchronizedMap(new HashMap(0)); - private final Map taskActionLoader = Collections.synchronizedMap(new HashMap()); public class DetailLoaderThread extends Thread { @Override @@ -648,7 +654,6 @@ public class TaskAdapter extends CursorAdapter implements Filterable { Random random = new Random(); Task task = new Task(); - LinkActionExposer linkActionExposer = new LinkActionExposer(); for(fetchCursor.moveToFirst(); !fetchCursor.isAfterLast(); fetchCursor.moveToNext()) { task.clear(); @@ -656,10 +661,6 @@ public class TaskAdapter extends CursorAdapter implements Filterable { if(task.isCompleted()) continue; - List actions = linkActionExposer.getActionsForTask(ContextManager.getContext(), task.getId()); - if (actions.size() > 0) - taskActionLoader.put(task.getId(), actions.get(0)); - if(detailsAreRecentAndUpToDate(task)) { // even if we are up to date, randomly load a fraction if(random.nextFloat() < 0.1) { @@ -683,7 +684,7 @@ public class TaskAdapter extends CursorAdapter implements Filterable { requestNewDetails(task); } - if(taskDetailLoader.size() > 0 || taskActionLoader.size() > 0) { + if(taskDetailLoader.size() > 0) { Activity activity = fragment.getActivity(); if (activity != null) { activity.runOnUiThread(new Runnable() { @@ -720,6 +721,46 @@ public class TaskAdapter extends CursorAdapter implements Filterable { } } + + private final Map taskActionLoader = Collections.synchronizedMap(new HashMap()); + public class ActionsLoaderThread extends Thread { + @Override + public void run() { + AndroidUtilities.sleepDeep(500L); + TodorooCursor fetchCursor = taskService.fetchFiltered( + query.get(), null, Task.ID, Task.TITLE, Task.DETAILS, Task.DETAILS_DATE, + Task.MODIFICATION_DATE, Task.COMPLETION_DATE); + try { + Task task = new Task(); + LinkActionExposer linkActionExposer = new LinkActionExposer(); + + for(fetchCursor.moveToFirst(); !fetchCursor.isAfterLast(); fetchCursor.moveToNext()) { + task.clear(); + task.readFromCursor(fetchCursor); + if(task.isCompleted()) + continue; + + List actions = linkActionExposer.getActionsForTask(ContextManager.getContext(), task.getId()); + if (actions.size() > 0) + taskActionLoader.put(task.getId(), actions.get(0)); + } + if(taskActionLoader.size() > 0) { + Activity activity = fragment.getActivity(); + if (activity != null) { + activity.runOnUiThread(new Runnable() { + @Override + public void run() { + notifyDataSetChanged(); + } + }); + } + } + } finally { + fetchCursor.close(); + } + } + } + /** * Add detail to a task * @@ -797,6 +838,7 @@ public class TaskAdapter extends CursorAdapter implements Filterable { taskDetailLoader.clear(); taskActionLoader.clear(); startDetailThread(); + startTaskActionsThread(); } /**