レイアウトは割愛。コードの工夫のみ。
グルグル表示の説明は表示のみが多く実際の稼働は思うように動作しない。初心者にはハードル高い。
グルグルを表示(ProgressBar.VISIBLE)して
ワーカースレッドで(処理)する。
処理後にメインスレッドに戻って
グルグルを非表示(ProgressBar.INVISIBLE)にする。
こんな回答で詳細はこちらへどうぞ。とリンク…。リンクをクリックする気は無い私^^;
いつも通り試行錯誤。
要領は、代替えAsyncTaskに割り当てる。
単純には動かない。
よくあるトラブルを潰す。
データの受け渡しを明確に記述して思い通りに手順が進んでいるか確認をしていく。
コード内容(綺麗?簡潔?)は気にしない。
動くかどうか。後でまとめれば良い。
という事で処理に必要なデータをまとめてクラスを作る。
場合によって、参照型か複製型でワーカースレッド処理へ渡す。
参照型は処理中にデータ元で変数の値の更新が発生すると問題が起こる場合がある。
そういう時は複製で渡す。
class test {
ArrayList< String> buff;
int index;
public test( ArrayList< String> buf, int no ) {
例/buff = buf; // 参照
例/buff = new ArrayList<>(buf); // 複製
index = no; // 複製
}
// 省略
public void finish() { // 複製時は 念のため後処理。参照時clear()実行すると元データ消去されるので注意
buff.clear();
}
}
グルグルを表示のON-OFFだと短時間の時にグルグルフラッシュで気になる。
遅延実行とフラグを組み合わせて設定時間より早く処理完了なら表示はしない工夫。
public class MyMainModel {
public MyMainModel(Context context) {
mContext = context;
}
private Context mContext = null;
public Context getContext() { return mContext;}
// 省略
public static boolean ON = true;
public static boolean OFF = false;
private boolean mProgressBarSW = false;
public boolean getProgressBarSW() {
return mProgressBarSW;
}
public void setProgressBarSW(boolean sw) {
mProgressBarSW = sw;
}
public void setProgressBarSW_ON() {//スイッチON
mProgressBarSW = ON;
showProgressCircle();
}
private ProgressBar mProgressBar = null;
public void setProgressCircle( ProgressBar pb ) {// レイアウト情報をセット
mProgressBar = pb;
}
public void showProgressCircle() { // 0.1秒後でも処理が終わらずフラグがONなら表示する
new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
@Override
public void run() {
if ( getProgressBarSW() == ON )
mProgressBar.setVisibility(ProgressBar.VISIBLE);
}
},100);
}
public void hideProgressCircle() { // ワーカースレッド処理後に呼ぶ。非表示、スイッチOFFを実行
mProgressBar.setVisibility(ProgressBar.GONE);
setProgressBarSW(OFF);
}
public void finish() {
mContext = null;
mProgressBar = null;
// 省略
}
}
グルグルスイッチ小細工完了。