Android 一休み
シロツメクサの中で寛ぐ柴犬です。
シロツメクサの花がいっぱい咲いているのですが、何か寂しい感じが拭えません。
何だろうと考えた結果、蝶・蜂などの昆虫が見当たりません。いなくなった原因は幼虫(毛虫)の食糧がなくなったのか???なんなんだこれはと思いました。
カモが元気に泳いでいました。
概要
dkajiwara 氏の「AsyncTaskの処理をタイムアウトさせる.md」という題目の記事を見つけました。
https://gist.github.com/dkajiwara-asnet/da7fb990aee7667c50de
コードは次の通りです。
これを基にいろいろ試してみましたので記録します。
new ExAsyncTask().setTimeOut(1000).execute();
public class ExAsyncTask extends AsyncTask<Void, Void, Void>{
/** TAG.*/
private static 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() {
try {
get(mTimeOut, TimeUnit.MILLISECONDS);
} catch (InterruptedException e) {
Log.e(TAG, null, e);
} catch (ExecutionException e) {
Log.e(TAG, null, e);
} catch (TimeoutException e) {
Log.i(TAG, "Running task has timed out!!", e);
if (isCancelled() && getStatus() == Status.RUNNING) {
ExAsyncTask.this.cancel(true);
}
}
}
};
@Override
protected Void doInBackground(Void... params) {
if (mTimeOut > 0) {
new Thread(mTimeOutTask).start();
}
//do someting
return null;
}
/**
* Set the time-out.
* @param timeOut milliseconds
* @return this
*/
public ExAsyncTask setTimeOut(long timeOut) {
mTimeOut = timeOut;
return this;
}
}
2024年2月26日現在
WEBのみでは断片的で覚えにくいので最初に購入した Kotlin の本です。
試してみたこと
アプリを実行して、最初「Step1」が表示されて1秒後に「Step2」が表示されることを期待しました。
package org.sibainu.relax.room.myapplication; import androidx.appcompat.app.AppCompatActivity; import android.os.AsyncTask; import android.os.Bundle; import android.util.Log; import android.widget.TextView; import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // new ExAsyncTask().setTimeOut(1000).execute(); ExAsyncTask eat = new ExAsyncTask(); eat.setTimeOut(1000).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() { try { get(mTimeOut, TimeUnit.MILLISECONDS); } catch (InterruptedException e) { Log.e(TAG, null, e); } catch (ExecutionException e) { Log.e(TAG, null, e); } catch (TimeoutException e) { Log.i(TAG, "Running task has timed out!!", e); if (isCancelled() && getStatus() == Status.RUNNING) { ExAsyncTask.this.cancel(true); } } } }; @Override protected void onPreExecute(){ TextView tv; tv = findViewById(R.id.textView); tv.setText("Step1"); } @Override protected String doInBackground(Void... params) { if (mTimeOut > 0) { new Thread(mTimeOutTask).start(); } //do someting return "Step2"; } @Override protected void onPostExecute(String result) { TextView tv; tv = findViewById(R.id.textView); tv.setText(result); } /** * Set the time-out. * @param timeOut milliseconds * @return this */ public ExAsyncTask setTimeOut(long timeOut) { mTimeOut = timeOut; return this; } } }
教えられたこと
先ずはっと思ったところは、この部分です。改めて、こうすることによってチェーンメソッドできることを思い出させてくれました。
public ExAsyncTask setTimeOut(long timeOut) {
mTimeOut = timeOut;
return this;
このようにできる new ExAsyncTask().setTimeOut(1000).execute();
private Runnable mTimeOutTask = new Runnable() の記述が分からなかったのですが、よく考えてみると次のように class のインスタンスを作っていることが分かりました。
こんな書き方ができるのかと改めて思いました。
private Runnable mTimeOutTask = new Runnable() {
@Override
public void run() {
--------省略--------
}
};
次のコードの省略形
private class runnable implements Runnable {
public runnable() {
}
@Override
public void run() {
--------省略--------
}
}
private runnable mTimeOutTask = new runnable();
実行してみる
左のショットが上のコードを実行してみたものです。
Step1 → Step2 の変化を期待しましたが Step1 の表示はなく無表示が1秒くらい続き Step2 の表示がありました。
次に onPostExecute の tv.setText(result); 行をコメントアウトして実行してみたものが右のショットです。
@Override
protected void onPostExecute(String result) {
TextView tv;
tv = findViewById(R.id.textView);
tv.setText(result); //←←← ここをコメントアウト
}
「Step0」の結果は、onCreate の ExAsyncTask onPreExecute で「Step1」としても onResume で「Step0」としているので理解できます。
onResume の tv.setText(“Step0”); 行をコメントアウトして実行してみたものが右のショットです。
@Override
protected void onResume() {
super.onResume();
TextView tv;
tv = findViewById(R.id.textView);
tv.setText("Step0"); //←←← ここをコメントアウト
}
onResume の「Step0」をコメントアウトしているので理解できます。
未解決
「Step1」の表示のあと、1秒後に「Step2」を表示するにはどうしたらよいのかという課題ができました。
フチベニベンケイ
現在のフチベニベンケイの姿です。
昨年秋の終わりにフチベニベンケイが落とした葉っぱを差して半年になります。
まだまだ小さいですが順調に育っているようです。
今日はここまでとします。