Sibainu Relax Room

柴犬と過ごす

Android 前回の課題について

今日のメインはヌートリアです。ジャンボネズミなのですが見ていると愛らしく感じます。

ヌートリアが泳いでました。結構速いスピードでした。

概要

前回の課題として、「Step0」から「Step2」への変化がないといことがありました。

このことを考えてみましたので記録します。

WEBのみでは断片的で覚えにくいので最初に購入した Kotlin の本です。

Logcat を見てみる

コードに Log.d(“タグ”,”インフォメーション”) を知りたい要所に挿入してコードのプロセスを見てみます。

コードは次のようにしてみました。

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TextView tv;
        tv = findViewById(R.id.textView);
        tv.setText("Step3");

        new ExAsyncTask().setTimeOut(10000).execute();
        //ExAsyncTask eat = new ExAsyncTask();
        //eat.setTimeOut(10000).execute();
    }

    @Override
    protected void onResume() {
        super.onResume();
        TextView tv;
        tv = findViewById(R.id.textView);
        tv.setText("Step0");
    }

    public class ExAsyncTask extends AsyncTask<Void, Void, String> {
        /** TAG.*/
        private final String TAG = ExAsyncTask.class.getSimpleName();

        /** Time-Out(milliseconds).*/
        private long mTimeOut = -1;

        /**
         * Invoked when the running task has timed out.
         */
        private Runnable mTimeOutTask = new Runnable(){
            @Override
            public void run() {
                Log.d(TAG,"mTimeOutTask0" + mTimeOut);
                try {
                    Log.d(TAG,"mTimeOutTask1" + mTimeOut);
                    Thread.sleep(mTimeOut);
                    Log.d(TAG,"mTimeOutTask2" + mTimeOut);
                } catch (InterruptedException e) {
                    Log.e(TAG, null, e);
                }
                Log.d(TAG,"mTimeOutTask3" + mTimeOut);
            }
        };

        @Override
        protected void onPreExecute(){
            TextView tv;
            tv = findViewById(R.id.textView);
            tv.setText("Step1");
            Log.d(TAG,"onPreExecute");
        }

        @Override
        protected String doInBackground(Void... params) {
            if (mTimeOut > 0) {
                Log.d(TAG,"doInBackground1");
                new Thread(mTimeOutTask).start();
                Log.d(TAG,"doInBackground2");
            }

            //do someting
            return "Step2";
        }

        @Override
        protected void onPostExecute(String result) {
            TextView tv;
            tv = findViewById(R.id.textView);
            tv.setText(result);
            Log.d(TAG,"onPostExecute");
        }

        /**
         * Set the time-out.
         * @param timeOut milliseconds
         * @return this
         */
        public ExAsyncTask setTimeOut(long timeOut) {
            mTimeOut = timeOut;
            return this;
        }

    }
}

下の画像は、実行させてみたAndroidStudio の Logcat の結果です。

mTimeOutTask110000 の時刻から10秒後に mTimeOutTask210000 のログが出ていますので、ここのところはいいようです。

しかし、 onPostExecute が mTimeOutTask110000 の直後にログが出ています。

考えてみれば当たり前ですね。10秒のスリープは別スレッドですので待たずにdoInBackground から戻り値が onPostExecute に返され「Step2」が表示されました。

前回の結果は当たり前のことのようです。

Thread.sleep() の位置を変える

Thread.sleep() を doInBackground の中に変えました。

        @Override
        protected String doInBackground(Void... params) {
            if (mTimeOut > 0) {
                Log.d(TAG,"doInBackground1");
                new Thread(mTimeOutTask).start();
                Log.d(TAG,"doInBackground2");
            }

            //ここに変えました
            try {
                Log.d(TAG,"doInBackground01" + mTimeOut);
                Thread.sleep(mTimeOut);
                Log.d(TAG,"doInBackground02" + mTimeOut);
            } catch (InterruptedException e) {
                Log.e(TAG, null, e);
            }
            //do someting
            return "Step2";
        }

これですと doInBackground0110000 の時刻の10秒後に doInBackground0210000 のログがあり、その後に onPostExecute のログがあります。

タブレットの表示も「Step0」の表示から10秒後に「Step2」の表示に変わりました。

この件はここまでとします。