Android 前回の課題について
今日のメインはヌートリアです。ジャンボネズミなのですが見ていると愛らしく感じます。
ヌートリアが泳いでました。結構速いスピードでした。
概要
前回の課題として、「Step0」から「Step2」への変化がないといことがありました。
このことを考えてみましたので記録します。
翔泳社 齊藤 新三 著
2024年2月26日現在
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」の表示に変わりました。
この件はここまでとします。