Ես կարդացի մի գրառում asynctask-ի մասին այստեղ, որտեղ ասվում է, որ այն կատարվի հիմնական թեմայի հետ զուգահեռ: օգտագործել այս դասի executeOnExecutor մեթոդը: Կարծում էի, որ ասինկտասկն արդեն զուգահեռ է կատարվում: Ինչ-որ մեկը կարո՞ղ է սա ինձ բացատրել:
Asynctask-ը չի աշխատում հիմնական թեմայի հետ զուգահեռ
- Տես՝ stackoverflow.com/a/24788257/295004 18.11.2015
Պատասխանները:
Շնորհակալություն @Rookie-ին և @Nashe-ին
Ինչ հասկացա, AsyncTask-ը կարող է աշխատել սերիական և զուգահեռ: Երբ AsyncTask-ն աշխատում է սերիական, յուրաքանչյուր առաջադրանք կատարվում է մեկը մյուսի հետևից, այսինքն. Ենթադրենք, որ օգտագործում եք AsyncTask պատկերը ֆայլից վերծանելու համար և ցանկանում եք վերծանել բազմաթիվ պատկերներ ձեր listview-ի համար: Այնուհետև դուք պետք է գործարկեք մի քանի AsyncTask ադապտերի getView()-ի վրա և այս AsyncTask-ից յուրաքանչյուրը կատարվում է սերիական, այսինքն. մեկը մյուսի հետևից:
Բայց քանի որ նոր սարքերն ունեն բազմաթիվ ֆիզիկական միջուկներ, այս սարքերը կարող են միաժամանակ մի քանի թելեր գործարկել: Այս դեպքում ձեր AsyncTask-ից յուրաքանչյուրը կարող է աշխատել միմյանց զուգահեռ:
Բայց դուք չեք կարող կանխատեսել, թե այս թեմաներից որն առաջինը կավարտվի: այսինքն. ցանկի դիտման ձեր 5-րդ շարքը կարող է ավարտել պատկերի վերծանումը ձեր առաջին շարքից առաջ:
Այսպիսով, AsyncTask.executeOnExecutor() (քանի որ API 11) թույլ է տալիս կատարել AsyncTask-ը զուգահեռաբար, իսկ AsyncTask.execute()-ը թույլ է տալիս կատարել AsyncTask սերիական:
Հուսով եմ դա կօգնի ձեզ..
Նախ պետք է հասկանաք, թե որտեղ ենք օգտագործելու executeOnExecutor մեթոդը, AsyncTask-ը հնարավորություն է տալիս ճիշտ և հեշտ օգտագործել UI շարանը: Այս դասը թույլ է տալիս կատարել ֆոնային գործողություններ և հրապարակել արդյունքները UI շղթայում՝ առանց շղթաների և/կամ մշակողների մանիպուլյացիայի:
Երբ առաջին անգամ ներկայացվեց, AsyncTasks-ը սերիականորեն իրականացվեց մեկ ֆոնային թեմայի վրա: Սկսած DONUT-ից, սա փոխվեց թելերի լողակի, որը թույլ է տալիս մի քանի առաջադրանքներ կատարել զուգահեռ: Սկսած HONEYCOMB-ից՝ առաջադրանքները կատարվում են մեկ շղթայի վրա՝ զուգահեռ կատարման հետևանքով առաջացած սովորական կիրառական սխալներից խուսափելու համար:
Եթե իսկապես ցանկանում եք զուգահեռ կատարում, կարող եք կանչել executeOnExecutor-ը (java.util.concurrent.Executor, Object[]) THREAD_POOL_EXECUTOR-ով: Օրինակ, եթե ցանկանում եք միաժամանակ երգ նվագել և ֆայլ ներբեռնել, ապա պետք է օգտագործեք ասինխադրական զուգահեռ կատարում (ASYNCTASK.THREAD_POOL_EXECUTOR)