рд╕реНрдЯреНрд░рд┐рдХреНрдЯрдореЛрдб рдФрд░ рдПрдПрдирдЖрд░ рдХреЗ рдЦрд┐рд▓рд╛рдл рд▓рдбрд╝рд╛рдИ
рдЬрд┐рдВрдЬрд░рдмреНрд░реЗрдб рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ рд╢реБрд░реВ, Google рдиреЗ рдПрдВрдбреНрд░реЙрдЗрдб рдореЗрдВ рдПрдХ рддрдВрддреНрд░ рдЬреЛрдбрд╝рд╛ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдпреВрдЖрдИ рдереНрд░реЗрдб рдореЗрдВ рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдП рдЧрдП рджреАрд░реНрдШрдХрд╛рд▓рд┐рдХ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЗрд╕ рддрдВрддреНрд░ StrictMode рдирд╛рдо рджреЗрдВред рдРрд╕рд╛ рдХреНрдпреЛрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛?
рдЖрдк рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрднрд╡рдд: рдПрдХ рдПрдкреНрд▓реАрдХреЗрд╢рди рдиреЙрдЯ рд░рд┐рд╕реНрдкреЙрдиреНрд╕рд┐рдВрдЧ рдбрд╛рдпрд▓реЙрдЧ рдмреЙрдХреНрд╕ рдпрд╛ рдПрдПрдирдЖрд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдЖрдпрд╛ рд╣реИред рдРрд╕рд╛ рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди 5 рд╕реЗрдХрдВрдб рдХреЗ рд▓рд┐рдП рдЗрдирдкреБрдЯ рдЗрд╡реЗрдВрдЯ (рдХреАрд╕реНрдЯреНрд░реЛрдХреНрд╕, рд╕реНрдХреНрд░реАрди рдкрд░ рдЯрдЪ) рдХрд╛ рдЬрд╡рд╛рдм рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИред UI рдереНрд░реЗрдб рдХреЛ рдмреНрд▓реЙрдХ рдХрд░рдиреЗ рд╡рд╛рд▓реА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХреЗ рд▓рд┐рдП, рд╕реНрдЯреНрд░рд┐рдХреНрдЯрдореЛрдб рддрдВрддреНрд░ рдкреЗрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдФрд░, рдПрдВрдбреНрд░реЙрдЗрдб 3.0 рдХреЗ рд╕рд╛рде рд╢реБрд░реВ, рд╕реНрдЯреНрд░рд┐рдХреНрдЯрдореЛрдб рдПрдХ рдпреВрдЖрдИ рдереНрд░реЗрдб рдореЗрдВ рдиреЗрдЯрд╡рд░реНрдХ рдЕрдиреБрд░реЛрдз рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рдкреНрд░рдпрд╛рд╕реЛрдВ рдХреЛ рджрдмрд╛ рджреЗрддрд╛ рд╣реИред
рддреЛ, рдпреВрдЖрдИ рдереНрд░реЗрдб рдХреЗ рдмрд╛рд╣рд░ рдиреЗрдЯрд╡рд░реНрдХ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдВрдбреНрд░реЙрдЗрдб рдХрд┐рд╕ рддрд░рд╣ рдХреЗ рддрдВрддреНрд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ?
AsyncTask
рд╕рдВрднрд╡рддрдГ рд╕рдмрд╕реЗ рдЖрдо рддрдВрддреНрд░реЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдиреЗрдЯрд╡рд░реНрдХ рд╕рдВрдЪрд╛рд▓рди рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ AsyncTaskред рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ, рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдХрдИ рдиреБрдХрд╕рд╛рди рд╣реИрдВ:
- рдЬрдм рдЖрдк рдбрд┐рд╡рд╛рдЗрд╕ рдХрд╛ рдУрд░рд┐рдПрдВрдЯреЗрд╢рди рдмрджрд▓рддреЗ рд╣реИрдВ, рддреЛ рдиреЗрдЯрд╡рд░реНрдХ рдереНрд░реЗрдб (рд╡рд░реНрдХрд░ рдереНрд░реЗрдб) рдЙрд╕ рдЧрддрд┐рд╡рд┐рдзрд┐ рд╕рдВрджрд░реНрдн рдХреЛ рдЦреЛ рджреЗрдЧрд╛ рдЬрд┐рд╕рдХреЗ рднреАрддрд░ рдЗрд╕реЗ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдФрд░ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдкрд░ - IllegalStateExceptionред рдЖрдорддреМрд░ рдкрд░, рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЧрддрд┐рд╡рд┐рдзрд┐ рд╕реНрдЯреНрд░реАрдо рдХреЛ рдиреЗрдЯрд╡рд░реНрдХред рдЧрддрд┐рд╡рд┐рдзрд┐ рдореЗрдВ рд░рджреНрдж рдХрд░реЗрдВ (рдСрдирдкреЙрдЬ рдореЗрдВ рдПрдХ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ) рдФрд░ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдЧрддрд┐рд╡рд┐рдзрд┐.рдСрдирд╕реНрдЯрд╛рд░реНрдЯ (рдСрдирд╕реНрдХреНрдпреВрдо) рдореЗрдВ рдЪрд▓рд╛рдПрдВред рд▓реЗрдХрд┐рди рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗрд╡рд▓ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд▓рд┐рдП рдЗрдВрддрдЬрд╛рд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рди рдХрд┐ рдпрд╛рддрд╛рдпрд╛рдд рдореЗрдВ рд╡реГрджреНрдзрд┐ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
- рдХреНрд╡реЗрд░реА рдкрд░рд┐рдгрд╛рдо рд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рдмреАрдЪ рдмрджрд▓рддреЗ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреА рдЬрд░реВрд░рдд рд╣реИред
- рдпрджрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ рд╣реИ, рддреЛ рд╕рд┐рд╕реНрдЯрдо рдЗрд╕реЗ рдЕрдкрдиреЗ рд╕рднреА рдереНрд░реЗрдбреНрд╕ рдХреЗ рд╕рд╛рде рдкреВрд░рд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
3.0 рд╕реЗ рд╢реБрд░реВ рд╣реЛрдХрд░, рд╣рдо рдмрдЪрд╛рд╡ рддрдВрддреНрд░ рдкрд░ рдЖрддреЗ рд╣реИрдВ рдЬреЛ рд╣рдореЗрдВ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ 3.0 рдиреАрдЪреЗ рдордВрдЪ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛? рдирд┐рд░рд╛рд╢рд╛ рди рдХрд░реЗрдВ рдФрд░ рд╕рдорд░реНрдерди-рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдЗрд╕ рддрдВрддреНрд░ рдХреЛ рд╡рд╛рдкрд╕ рднреЗрдЬ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рд▓реЛрдбрд░
рдХреНрдпрд╛ рдЗрддрдирд╛ рдЕрдЪреНрдЫрд╛ рдЗрд╕ рддрдВрддреНрд░ рд╣реИ:
- рдЧрддрд┐рд╡рд┐рдзрд┐ рдФрд░ рдЯреБрдХрдбрд╝рд╛ рдХреА рдЙрдкрд▓рдмреНрдзрддрд╛
- рдЖрд╡реЗрджрди рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ (рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ рд╕реНрдерд┐рдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рджреГрд╢реНрдпрдорд╛рди, рдЖрджрд┐) рдкрд░ рдирдЬрд╝рд░ рд░рдЦрддрд╛ рд╣реИ
- рдпрд╣ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдбреЗрдЯрд╛ рд▓реЛрдб рд╕рдХреНрд╖рдо рдмрдирд╛рддрд╛ рд╣реИ
- рдбреЗрдЯрд╛ рд╕реНрд░реЛрдд рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ
- рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдмрджрд▓рддреЗ рд╕рдордп рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЕрдВрддрд┐рдо рдХреНрд╡реЗрд░реА рдХрд╛ рдкрд░рд┐рдгрд╛рдо рджреЗрддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдлрд┐рд░ рд╕реЗ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ
рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдЖрдк рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдбреЗрдЯрд╛ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓реЛрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ? рд▓реЛрдбрд░ рдХреЗ рдЕрдВрджрд░, рдПрдХ рдиреЗрдЯрд╡рд░реНрдХ рд╕реНрдЯреНрд░реАрдо рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдкрд░рд┐рдгрд╛рдо рдкрд╛рд░реНрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ ContentProvider рдХреЛ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЙрдиреНрд╣реЗрдВ рдбреЗрдЯрд╛рд╕реНрдЯреЛрд░реЗрдЬ рдореЗрдВ рдмрдЪрд╛рддрд╛ рд╣реИ (рдпрд╣ рдореЗрдореЛрд░реА, рдлрд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо, рд╕рд╛рдЗрдХреНрд▓рд╛рдЗрдЯ рдбреЗрдЯрд╛рдмреЗрд╕ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ) рдФрд░ рд▓реЛрдбрд░ рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдбреЗрдЯрд╛ рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рд▓реЛрдбрд░, рдмрджрд▓реЗ рдореЗрдВ, рдирдП рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП ContentProvider рдХреЛ рдкреЛрд▓ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдЧрддрд┐рд╡рд┐рдзрд┐ (рдлрд╝реНрд░реИрдЧрдореЗрдВрдЯ) рдкрд░ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдпрджрд┐ рд╣рдо рдиреЗрдЯрд╡рд░реНрдХ рд╕реНрдЯреНрд░реАрдо рдХреЛ рдХрд┐рд╕реА рд╕реЗрд╡рд╛ рд╕реЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЧрд╛рд░рдВрдЯреА рджреЗ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧрд╛ рднрд▓реЗ рд╣реА рдЖрд╡реЗрджрди рдХреЛ рдХрдо рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛ (рдХреНрдпреЛрдВрдХрд┐ рд╕реЗрд╡рд╛ рдкреГрд╖реНрдарднреВрдорд┐ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реЗ рдЕрдзрд┐рдХ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╣реИ)ред
рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдХреНрдпрд╛ рд▓рд╛рдн рд╣реИрдВ:
- рдХреНрд╡реЗрд░реА рдХреИрд╢рд┐рдВрдЧ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛
- рдкрд╛рд░рджрд░реНрд╢реА рдиреЗрдЯрд╡рд░реНрдХ рдкрд░рдд
- рдиреЗрдЯрд╡рд░реНрдХ рдкрд░рдд рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдмрд╛рд╣рд░ рдХрд░рдиреЗ рдФрд░ рдПрдХ рдСрдлрд╝рд▓рд╛рдЗрди рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ред
- рд▓реМрдЯрд╛рдП рдЧрдП рдбреЗрдЯрд╛ рдХреЗ рдкреНрд░рд╛рд░реВрдк рдХреЗ рдмрд╛рд╡рдЬреВрдж, рдЬрд┐рд╕ рдбреЗрдЯрд╛ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╡рд╣ рд╕реАрдзреЗ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ ред
- рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рд╡реЗрд╢ рдмрд┐рдВрджреБ
рдЙрджрд╛рд╣рд░рдг рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиpublic abstract class AbstractRestLoader extends Loader<Cursor> { private static final int CORE_POOL_SIZE = Android.getCpuNumCores() * 4; private static final int MAX_POOL_SIZE = CORE_POOL_SIZE * 4; private static final int POOL_KEEP_ALIVE = 1; private static final BlockingQueue<Runnable> sPoolWorkQueue; private static final ThreadFactory sThreadFactory; private static final ExecutorService sThreadPoolExecutor; private static final AsyncHttpClient sDefaultHttpClient; private static final Handler sUiHandler; static { sPoolWorkQueue = new LinkedBlockingQueue<Runnable>(CORE_POOL_SIZE * 2); sThreadFactory = new LoaderThreadFactory(); sThreadPoolExecutor = new ThreadPoolExecutor( CORE_POOL_SIZE, MAX_POOL_SIZE, POOL_KEEP_ALIVE, TimeUnit.SECONDS, sPoolWorkQueue, sThreadFactory ); sDefaultHttpClient = new AsyncHttpClient(); sUiHandler = new Handler(Looper.getMainLooper()); } private final AsyncHttpClient mHttpClient; private final HttpMethod mRestMethod; private final Uri mContentUri; private final ContentObserver mObserver; private String[] mProjection; private String mWhere; private String[] mWhereArgs; private String mSortOrder; private boolean mLoadBeforeRequest; private FutureTask<?> mLoaderTask; private AsyncHttpRequest mRequest; private Cursor mCursor; private boolean mContentChanged; public AbstractRestLoader(Context context, HttpMethod request, Uri contentUri) { super(context); mHttpClient = onInitHttpClient(); mRestMethod = request; mContentUri = contentUri; mObserver = new CursorObserver(sUiHandler); } public Uri getContentUri() { return mContentUri; } public AbstractRestLoader setProjection(String[] projection) { mProjection = projection; return this; } public AbstractRestLoader setWhere(String where, String[] whereArgs) { mWhere = where; mWhereArgs = whereArgs; return this; } public AbstractRestLoader setSortOrder(String sortOrder) { mSortOrder = sortOrder; return this; } public AbstractRestLoader setLoadBeforeRequest(boolean load) { mLoadBeforeRequest = load; return this; } @Override public void deliverResult(Cursor cursor) { final Cursor oldCursor = mCursor; mCursor = cursor; if (mCursor != null) { mCursor.registerContentObserver(mObserver); } if (isStarted()) { super.deliverResult(cursor); mContentChanged = false; } if (oldCursor != null && oldCursor != cursor && !oldCursor.isClosed()) { oldCursor.unregisterContentObserver(mObserver); oldCursor.close(); } } @Override protected void onStartLoading() { if (mCursor == null || mContentChanged) { forceLoad(); } else { deliverResult(mCursor); } } @Override protected void onForceLoad() { cancelLoadInternal(); if (mLoadBeforeRequest) { reloadCursorInternal(); } restartRequestInternal(); } @Override protected void onReset() { cancelLoadInternal(); if (mCursor != null && !mCursor.isClosed()) { mCursor.close(); } mCursor = null; } protected AsyncHttpClient onInitHttpClient() { return sDefaultHttpClient; } protected void onCancelLoad() { } protected void onException(Exception e) { } protected void deliverResultBackground(final Cursor cursor) { sUiHandler.post(new Runnable() { @Override public void run() { deliverResult(cursor); } }); } protected void deliverExceptionBackground(final Exception e) { sUiHandler.post(new Runnable() { @Override public void run() { onException(e); } }); } protected abstract void onParseInBackground(HttpHead head, InputStream is); protected Cursor onLoadInBackground(Uri contentUri, String[] projection, String where, String[] whereArgs, String sortOrder) { return getContext().getContentResolver().query(contentUri, projection, where, whereArgs, sortOrder); } private void reloadCursorInternal() { if (mLoaderTask != null) { mLoaderTask.cancel(true); } mLoaderTask = new FutureTask<Void>(new Callable<Void>() { @Override public Void call() throws Exception { deliverResultBackground(onLoadInBackground(mContentUri, mProjection, mWhere, mWhereArgs, mSortOrder)); return null; } }); sThreadPoolExecutor.execute(mLoaderTask); } private void restartRequestInternal() { if (mRequest != null) { mRequest.cancel(); } mRequest = mHttpClient.execute(mRestMethod, new AsyncHttpCallback() { @Override public void onSuccess(HttpHead head, InputStream is) { onParseInBackground(head, is); } @Override public void onException(URI uri, Exception e) { deliverExceptionBackground(e); } }); } private void cancelLoadInternal() { onCancelLoad(); if (mLoaderTask != null) { mLoaderTask.cancel(true); mLoaderTask = null; } if (mRequest != null) { mRequest.cancel(); mRequest = null; } } private static final class LoaderThreadFactory implements ThreadFactory { private final AtomicLong mId = new AtomicLong(1); @Override public Thread newThread(Runnable r) { final Thread thread = new Thread(r); thread.setName("LoaderThread #" + mId.getAndIncrement()); return thread; } } private final class CursorObserver extends ContentObserver { public CursorObserver(Handler handler) { super(handler); } @Override public boolean deliverSelfNotifications() { return true; } @Override public void onChange(boolean selfChange) { onChange(selfChange, null); } @Override public void onChange(boolean selfChange, Uri uri) { if (isStarted()) { reloadCursorInternal(); } else { mContentChanged = true; } } } }
рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ public class MessageActivity extends FragmentActivity implements LoaderManager.LoaderCallbacks<Cursor> { private ListView mListView; private CursorAdapter mListAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.ac_message_list); mListView = (ListView) findViewById(android.R.id.list); mListAdapter = new CursorAdapterImpl(getApplicationContext()); getSupportLoaderManager().initLoader(R.id.message_loader, null, this); } @Override public Loader<Cursor> onCreateLoader(int id, Bundle args) { return new AbstractRestLoader(getApplicationContext(), new HttpGet("API URL"), null) { @Override protected void onParseInBackground(HttpHead head, InputStream is) { try { getContext().getContentResolver().insert( Messages.BASE_URI, new MessageParser().parse(IOUtils.toString(is)) ); } catch (IOException e) { deliverExceptionBackground(e); } } @Override protected void onException(Exception e) { Logger.error(e); } }.setLoadBeforeRequest(true); } @Override public void onLoadFinished(Loader<Cursor> loader, Cursor data) { mListAdapter.swapCursor(data); } @Override public void onLoaderReset(Loader<Cursor> loader) { mListAdapter.swapCursor(null); } }
рдкреБрдирд╢реНрдЪ
Android REST рдХреНрд▓рд╛рдЗрдВрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛Android рдбреЗрд╡рд▓рдкрд░реНрд╕ - рд▓реЛрдбрд░Android рдбреЗрд╡рд▓рдкрд░ - рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдФрд░ рдзрд╛рдЧреЗ