Androidã«ã€ããŠã®è©±ãç¶ããŸãã ãããŠä»åã¯ãããã»ã¹ãšã¹ã¬ããã«é¢ãã貎éãªæ
å ±ãå
±æããããšæããŸãããããã®æ
å ±ã¯ãã¢ããªã±ãŒã·ã§ã³ãèšè¿°ããéã®ãšã©ãŒã誀解ãé¿ããããã«ãããçè§£ãããåžžã«æå
ã«ããå¿
èŠããããŸãã èšäºã®æåŸã«ããã¿ã³ãã¯ãªãã¯ããã ãã§ç»åãImageViewã«ããŒãããAsyncTaskã®å®è£
äŸã瀺ããŸãã
ãŸãããã®ã¬ã€ãã®ãã®ãããã¯ã«ã€ããŠè©³ãããèªã¿ããã ããŸã
-developer.android.com/guide/topics/fundamentals/processes-and-threads.htmlAndroidã®ããã»ã¹ãšã¹ã¬ããã«é¢ããæ³šæã¢ããªã±ãŒã·ã§ã³ã³ã³ããŒãã³ããèµ·åããã¢ããªã±ãŒã·ã§ã³ã§ä»ã®ã³ã³ããŒãã³ããå®è¡ãããŠããªãå ŽåãAndroidã¯åäžã®å®è¡ã¹ã¬ããã§ã¢ããªã±ãŒã·ã§ã³ã®æ°ããããã»ã¹ãäœæããŸãã ããã©ã«ãã§ã¯ã1ã€ã®ã¢ããªã±ãŒã·ã§ã³ã®ãã¹ãŠã®ã³ã³ããŒãã³ãã¯ããã¡ã€ã³ããšåŒã°ããã¹ã¬ããã®1ã€ã®ããã»ã¹ã§èµ·åãããŸãã ã¢ããªã±ãŒã·ã§ã³ã³ã³ããŒãã³ããèµ·åãããç¹å®ã®ã¢ããªã±ãŒã·ã§ã³ã®ããã»ã¹ãæ¢ã«ååšããå ŽåïŒã¢ããªã±ãŒã·ã§ã³ã®äžéšã®ã³ã³ããŒãã³ããååšããå ŽåïŒãã³ã³ããŒãã³ãã¯ãã®ããã»ã¹ã§èµ·åããããã®å®è¡ãããŒã䜿çšããŸãã ã¢ããªã±ãŒã·ã§ã³ã®ã³ã³ããŒãã³ãããšã«ç°ãªãããã»ã¹ãèšå®ããããšã«ããããã®åäœã倿Žã§ããŸãã ããã«ãä»»æã®ããã»ã¹ã«ã¹ã¬ããã远å ã§ããŸãã
ãããã§ã¹ããã¡ã€ã«ã䜿çšããŠãã³ã³ããŒãã³ãã®åå¥ã®ããã»ã¹ãå®çŸ©ã§ããŸãã åã³ã³ããŒãã³ãã¿ã°ïŒã¢ã¯ãã£ããã£ããµãŒãã¹ãã¬ã·ãŒããŒããããã€ããŒïŒã¯ãandroidïŒprocess屿§ããµããŒãããŸãã ãã®å±æ§ã䜿çšãããšãã³ã³ããŒãã³ããå®è¡ããããã»ã¹ãæå®ã§ããŸãã ç°ãªãã¢ããªã±ãŒã·ã§ã³ã®ã³ã³ããŒãã³ããå®è¡ãããããã»ã¹ãæå®ããããšãã§ããŸãã ãã®å±æ§ã¯ããã¹ãŠã®ã¢ããªã±ãŒã·ã§ã³ã³ã³ããŒãã³ãã«ç¹å®ã®ããã»ã¹ãæå®ã§ããããã«ããã¢ããªã±ãŒã·ã§ã³ã¿ã°ã§ããµããŒããããŠããŸãã
Androidã¯ãå¯èœãªéãã¢ããªã±ãŒã·ã§ã³ããã»ã¹ããµããŒãããããšããŸããããªãœãŒã¹ãå¿
èŠãªå Žåã¯ãéèŠãªéå±€ã«åŸã£ãŠå€ãããã»ã¹ã眮ãæããããŸãã
éèŠåºŠã®éå±€ã«ã¯5ã€ã®ã¬ãã«ããããŸãïŒïŒãªã¹ãã®æåã®ã¬ãã«ã®ããã»ã¹ã¯æåŸã«åé€ãããŸãïŒ
1.ãŠãŒã¶ãŒã察話ããããã»ã¹ïŒãã©ã¢ã°ã©ãŠã³ãããã»ã¹ïŒãã®ãããªããã»ã¹ã«ã¯ãããšãã°ã次ã®ãã®ãå«ãŸããŸãã ãŠãŒã¶ãŒã察話ãããµãŒãã¹ïŒãµãŒãã¹ã€ã³ã¹ã¿ã³ã¹ïŒã startForegroundïŒïŒã¡ãœããã«ãã£ãŠèµ·åããããµãŒãã¹ã ã©ã€ããµã€ã¯ã«ã®ããããã®æ¹æ³ãå®è¡ãããµãŒãã¹ã onReceiveïŒïŒã¡ãœãããå®è¡ããBroadcastReceiverã
2.ç®ã«èŠããããã»ã¹ãã©ã°ã©ã1ã®æ¡ä»¶ãæºããããŠããªããããŠãŒã¶ãŒãç»é¢ã«è¡šç€ºãããã®ã«åœ±é¿ããããã»ã¹ã ããšãã°ãã¢ã¯ãã£ããŒã·ã§ã³ã®onPauseïŒïŒã¡ãœãããåŒã³åºãããŸãã
3.ãµãŒãã¹ããã»ã¹startServiceïŒïŒã«ãã£ãŠéå§ããããµãŒãã¹
4.ããã¯ã°ã©ãŠã³ãããã»ã¹ããã¯ã°ã©ãŠã³ãã§å®è¡ããããŠãŒã¶ãŒã«ã¯èŠããªãããã»ã¹ã
5.空ã®ããã»ã¹ã¢ããªã±ãŒã·ã§ã³ã³ã³ããŒãã³ãã«ã¯onLowMemoryïŒïŒã¡ãœãããååšããŸãããonDestroyïŒïŒã¡ãœããã«100ïŒ
äŸåã§ããªãã®ãšåæ§ã«ããã®ã¡ãœããã®åŒã³åºãã«äŸåããããšã¯ã§ããªãã®ã§ãããŒã¿ãèšå®ãä¿åããããžãã¯ãã¡ãœããã«å®è£
ã§ããŸãonStopïŒïŒãããã¯ïŒåœŒããä¿èšŒããïŒæ£ç¢ºã«åŒã³åºãããŸãã
ã¢ããªã±ãŒã·ã§ã³ãèµ·åãããšãã·ã¹ãã ã¯ãã®ã¢ããªã±ãŒã·ã§ã³ã®å®è¡ã®ãã¡ã€ã³ãã¹ã¬ãããäœæããŸããããã¯UIã¹ã¬ãããšãåŒã°ããŸãã ãã®ã¹ããªãŒã ã¯ããŠã£ãžã§ããïŒãã¿ã³ããªã¹ãïŒãæç»ãããã¢ããªã±ãŒã·ã§ã³ã®ã€ãã³ããåŠçããããããéåžžã«éèŠã§ãã ã·ã¹ãã ã¯ãã³ã³ããŒãã³ãã®ã€ã³ã¹ã¿ã³ã¹ããšã«åå¥ã®ã¹ã¬ãããäœæããŸããã 1ã€ã®ããã»ã¹ã§å®è¡ãããŠãããã¹ãŠã®ã³ã³ããŒãã³ãã¯ãUIã¹ã¬ããã§äœæãããŸãã AndroidãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã©ã€ãã©ãªã¯ã¹ã¬ããã»ãŒãã§ã¯ãªããããæ¬¡ã®2ã€ã®éèŠãªã«ãŒã«ããããŸãã
1ïŒUIã¹ã¬ããããããã¯ããªã
2ïŒéUIã¹ã¬ããããUIã³ã³ããŒãã³ãã«ã¢ã¯ã»ã¹ããªãã§ãã ãã
ããã§ããããã¯ãŒã¯ããImageViewã«ç»åãã¢ããããŒãããŠããã«è¡šç€ºãããšããã¿ã¹ã¯ããã£ããšããŸãã ã©ãããïŒ è«ççã«ã¯ã次ã®ãããªããã¹ãŠã®äœæ¥ãå®è¡ããå¥ã®ã¹ã¬ãããäœæããŸãã
public void onClick(View v) { new Thread(new Runnable() { public void run() { Bitmap b = loadImageFromNetwork("http://example.com/image.png"); mImageView.setImageBitmap(b); } }).start(); }
ç»åãããŒãããæäœãå¥ã®ã¹ããªãŒã ã«ç§»åãããããä¿¡ããããªãããã«èŠããŸãã åé¡ã¯ãã«ãŒã«çªå·2ã«éåããããšã§ãã æ¬¡ã®æ¹æ³ã䜿çšããŠããã®åé¡ãä¿®æ£ã§ããŸãã
Activity.runOnUiThreadïŒå®è¡å¯èœïŒ
View.postïŒå®è¡å¯èœïŒ
View.postDelayedïŒå®è¡å¯èœãé·ãïŒ
ããšãã°ãæåã®ãã®ã䜿çšããŸãã
public void onClick(View v) { new Thread(new Runnable() { public void run() { final Bitmap bitmap = loadImageFromNetwork("http://example.com/image.png"); mImageView.post(new Runnable() { public void run() { mImageView.setImageBitmap(bitmap); } }); } }).start(); }
çŸåšãå®è£
ã¯ã¹ã¬ããã»ãŒãã§ãããããã¯ãŒã¯æäœã¯å¥ã®ã¹ã¬ããã§å®è¡ãããImageViewã¯UIã¹ããªãŒã ããã¢ã¯ã»ã¹ãããŸãã
幞ããªããšã«ããããã®æäœã¯Handlerã¯ã©ã¹ã®ç¶æ¿ã䜿çšããŠå¿
èŠãªããžãã¯ãå®è£
ããããšã§çµã¿åãããããšãã§ããŸãããæåã®è§£æ±ºçã¯AsyncTaskã¯ã©ã¹ãç¶æ¿ããããšã§ãã
AsyncTaskã䜿çšãããšãéåæäœæ¥ãå®è¡ãããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ãæŽæ°ã§ããŸãã
ã¢ããã°ã¬ãŒãããã«ã¯ãonPostExecuteïŒïŒã¡ãœãããå®è£
ãããã¹ãŠã®ããã¯ã°ã©ãŠã³ãäœæ¥ãdoInBackgroundïŒïŒã¡ãœããã§å²ã¿ãŸãã ç¬èªã®ã¿ã¹ã¯ãå®è£
ããããexecuteïŒïŒã¡ãœããã§å®è¡ããå¿
èŠããããŸãã
ç»åã®èªã¿èŸŒã¿ãšè¡šç€ºã®ã¿ã¹ã¯ãå®è£
ãããçŽæãããAsyncTaskã®äŸã玹ä»ããŸãïŒæ³šéä»ãã®ãªãã·ã§ã³ãšæšæºãã€ã¢ãã°ãããã³ã«ã®äœ¿çšããã®éžè±ïŒã
@EActivity(R.layout.main) public class DownloadImageActivity extends Activity { ProgressDialog progress; @ViewById ImageView image; @ViewById Button runButt; String pictUrl = "http://www.bigfoto.com/sites/main/churfirsten_switzerland-xxx.JPG"; @BeforeCreate void getProgressDialog(){ progress = new ProgressDialog(this); progress.setMessage("Loading..."); } @Click(R.id.runButt) void runClick(){ new DownloadImageTask().execute(pictUrl); } class DownloadImageTask extends AsyncTask<String, Void, Bitmap> { @Override protected Bitmap doInBackground(String... params) { publishProgress(new Void[]{});
次ã«ããã€ã¢ãã°ã®æäœã®èгç¹ããæãæ£ãããªãã·ã§ã³ãæ€èšããŸãã
public class DownloadImageActivity extends Activity { ImageView image; Button runButt; final static String PICT_URL = "http://www.bigfoto.com/sites/main/churfirsten_switzerland-xxx.JPG"; final int PROGRESS_DLG_ID = 666; final static String DEBUG_TAG = "+++ImageDownloader+++"; @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); loadViews(); } private void loadViews(){ runButt = (Button)findViewById(R.id.runButt); image =(ImageView)findViewById(R.id.image); } @Override protected Dialog onCreateDialog(int dialogId){ ProgressDialog progress = null; switch (dialogId) { case PROGRESS_DLG_ID: progress = new ProgressDialog(this); progress.setMessage("Loading..."); break; } return progress; } public void runButtonHandler(View button){ if(button.getId() == R.id.runButt) new DownloadImageTask().execute(PICT_URL); } class DownloadImageTask extends AsyncTask<String, Void, Bitmap> { @Override protected Bitmap doInBackground(String... params) { publishProgress(new Void[]{}); String url = ""; if( params.length > 0 ){ url = params[0]; } InputStream input = null; try { URL urlConn = new URL(url); input = urlConn.openStream(); } catch (MalformedURLException e) { Log.d(DEBUG_TAG,"Oops, Something wrong with URL..."); e.printStackTrace(); } catch (IOException e) { Log.d(DEBUG_TAG,"Oops, Something wrong with inpur stream..."); e.printStackTrace(); } return BitmapFactory.decodeStream(input); } @Override protected void onProgressUpdate(Void... values) { super.onProgressUpdate(values); showDialog(PROGRESS_DLG_ID); } @Override protected void onPostExecute(Bitmap result) { super.onPostExecute(result); dismissDialog(PROGRESS_DLG_ID); image.setImageBitmap(result); } } }
ããå€ãã®ã³ãŒãããããŸããããã€ã¢ãã°ã®æäœã«ã¯æšæºãããã³ã«ã䜿çšããããšããå§ãããŸãã
ãŸããåå¿è
ããã®ã³ãŒããç°¡åã«è©Šããããã«ããã¹ãŠã®æ³šéãåé€ããŸããã
æå®ããå€ãæã€å±æ§ããã¿ã³ã¬ã€ã¢ãŠãã«è¿œå ããããšãå¿ããªãã§ãã ããïŒandroidïŒonClick = "runButtonHandler"
ããã«ãå
¬åŒããã¥ã¡ã³ãïŒ
Tyts ïŒããã³ç§ã®å ŽåãpreExecuteïŒïŒã¯äœ¿çšãããŸããããã¿ã¹ã¯ãéå§ããåã«ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã§ããã€ãã®ã¢ã¯ã·ã§ã³ãå®è¡ããå¿
èŠãããå Žåã¯ããã®ã¡ãœããã䜿çšããŠãã ããã
AsyncTaskã«æž¡ããããã©ã¡ãŒã¿ãŒïŒ
1.ãã©ã¡ãŒã¿ãŒïŒãã®å ŽåãURLïŒã
2.é²è¡ç¶æ³ïŒã¿ã¹ã¯å€æŽã®é²è¡ç¶æ³ãæå®ããåäœïŒã ç§ãã¡ã®å Žåãããã¯äœ¿çšãããŸããã
3.ã¿ã¹ã¯ã®çµæïŒãã®å Žåããããããããªããžã§ã¯ãïŒ
ã³ãŒãã¯éåžžã«ç°¡åã§ãããã¹ãŠã®ããã¯ã°ã©ãŠã³ãäœæ¥ãdoInBackGroundïŒïŒã¡ãœããã§è¡ããpublishProgressïŒïŒã¡ãœãããåŒã³åºããŸããããã«ãããonProgressUpdateïŒïŒã¡ãœãããåŒã³åºããããšãã«ç»åãããŒãããããšProgressDialogãã¹ãã³ããŸãã ããã¯ã°ã©ãŠã³ãã®äœæ¥ãå®äºããåŸãonPostExecuteïŒïŒã¡ãœãããåŒã³åºãããdoInBackGroundïŒïŒã¡ãœããã®çµæã転éãããŸãããã®å Žåãããã¯Bitmapãªããžã§ã¯ãã§ãããããã§ImageViewã«ããŒãããŸãã
èæ
®ãã¹ãããã€ãã®éèŠãªç¹ã«æ³šæããŠãã ããã
1ïŒdoInBackGroundïŒïŒã¡ãœããã¯ããã¯ã°ã©ãŠã³ãã¹ã¬ããã§å®è¡ãããããããã®ã¡ãœããå
ã§ã¯UIã¹ããªãŒã ã«ã¢ã¯ã»ã¹ã§ããŸããã
2ïŒonPostExecuteïŒïŒããã³onProgressUpdateïŒïŒã¡ãœããã¯UIã¹ã¬ããã§å®è¡ããããããUIã³ã³ããŒãã³ãã«å®å
šã«ã¢ã¯ã»ã¹ã§ããŸãã
ãããã«ã¯ããandroid-annotationsã©ã€ãã©ãªãå床é©çšããã®ã§ãã¢ãããŒã·ã§ã³ã«é©ããªãã§ãã ããã
ã¢ããªã±ãŒã·ã§ã³éçºã®ééããé²ãããã«ãAndroidã®ããã»ã¹ã¢ãã«ãçè§£ããããšãéèŠã§ãã
ãã®èšäºã¯ããã®ã¿ã¹ã¯ã®å®è£
ãšã¹ããªãŒã ã®æäœã«ãããå©çšå¯èœãªæ
å ±ãšå人çãªçµéšã®åŠçã§ãã
ãã€ãã®ããã«ãPMã®èšäºã®å
容ã«ã€ããŠã®åžæãšã³ã¡ã³ãã 远å ãŸãã¯è£è¶³ãããã®ãããå Žåã¯ãã³ã¡ã³ãã«èªç±ã«èšå
¥ããŠãã ããã
UPDãã®èšäºã¯ããã€ã¢ãã°ã®æäœã«é¢ããŠããæ£ç¢ºãªããŒãžã§ã³ã远å ããããšã«ããæŽæ°ãããŸãã