とりあえずざっくり。後で無駄を削ぐ。
グルグル表示中は専用フラグを立ててUI操作が発生してもスルーさせる。念のために。
ワーカースレッド処理用のデータクラス作成。
ワーカースレッド内でtry/catchを使い例外発生を認知。
ワーカースレッドは停止するけどメインは引き釣られず動く事もあるのでエラー確認はきっちりと。
グルグル表示遅延スイッチONの場所は、一本の流れで分岐が無ければ直前でなくても良い。
MyMainModel と MainViewModel 見間違いそうで失敗した。いつかクラス名の変更をしよう。
あと、RecyclerViewのアクセスはメインスレッドでないと例外でるので一時移動。最後にメインに戻って設定もアリだけど、できるかどうか試した。
public class DirectoryFragment extends Fragment {
private MainViewModel mViewModel;
private RecyclerView mRecyclerView = null;
private ImageView mButton = null;
private View.OnClickListener mButtonClick;
private MyAdaptrData aData = null;
// 省略
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 省略
mViewModel = new ViewModelProvider((ViewModelStoreOwner) requireContext()).get(MainViewModel.class);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_directory, container, false);
}
@Override
public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
// 省略
mButtonClick = v -> {
if (mViewModel.getValueAllWaitFlag()) return;// UI操作をスルーさせる
// 省略
};
mButton = view.findViewById(R.id.button);
mButton.setOnClickListener(mButtonClick);
// 省略
mRecyclerView = view.findViewById(R.id.directory_recyclerview);
mRecyclerView.setHasFixedSize(true);
mRecyclerView.setVerticalScrollBarEnabled(false);
mRecyclerView.setLayoutManager(
new LinearLayoutManager( requireContext(), RecyclerView.VERTICAL, false ));
File file;
// 省略
aData = new MyAdaptrData(
mViewModel,
mRecyclerView,
// 省略
);
new MyTask_onViewCreated(aData).execute();
}
private static class MyAdaptrData {
MainViewModel mViewModel = null;
RecyclerView mRecyclerView = null;
// 省略
public MyAdaptrData(
MainViewModel viewModel,
RecyclerView rv,
// 省略
) {
mViewModel = viewModel;
mRecyclerView = rv;
// 省略
}
public MainViewModel getMainViewModel() { return mViewModel;}
public RecyclerView getRecyclerView() { return mRecyclerView;}
// 省略
public void finish() {
mViewModel = null;
mRecyclerView = null;
// 省略
}
}
private static class MyTask_onViewCreated {
ExecutorService executorService;
MyAdaptrData aData_OVC;
MyMainModel mMainModel;
MyFileList_Directory fList;
int pos = 0;
public MyTask_onViewCreated(MyAdaptrData data) { // インスタンス時にデータを渡す場合
super();
aData_OVC = data;
executorService = Executors.newSingleThreadExecutor();
mMainModel = aData_OVC.getMainViewModel().getValueMyMainModel();
}
class Run_onViewCreated implements Runnable {//ワーカースレッド
@Override
public void run() {
try {
fList = new MyFileList_Directory(aData_OVC.getFile());
// 省略 RecyclerView().scrollToPosition()設定用の位置算出部分
aData_OVC.getRecyclerView().post(new Runnable() {//メインスレッドのRecyclerViewにアクセス
@Override
public void run() { // ここだけメインスレッド
aData_OVC.getMainViewModel().setFileList_directory(fList);
aData_OVC.getRecyclerView().setAdapter(
new MyDirectoryListAdapter( aData_OVC.getMainViewModel() )
);
aData_OVC.getRecyclerView().scrollToPosition( pos );
}
});
} catch (Exception e) { /* 例外発生は起こりやすいのでキャッチする */;}
new Handler(Looper.getMainLooper())
.post(MyTask_onViewCreated.this::onPostExecute); // メインスレッドに戻る
}
}
void execute() { // execute(List<> list)とか、ここでデータを渡す事もOK。参照か、複製かを考える事
onPreExecute();
executorService.submit(new Run_onViewCreated());//ワーカースレッドへ移行
}
void onPreExecute() {//メインスレッド
aData_OVC.getMainViewModel().setAllWaitFlag(true);//UI操作待機フラグON
mMainModel.setProgressBarSW_ON();// ぐるぐる表示 遅延スイッチ
}
void onPostExecute() {//メインスレッド
aData_OVC.getDirectoryName().setText(
aData_OVC.getMainViewModel().getValueFileList_directory().getTargetDirAbsolutePath());
aData_OVC.getMainViewModel().setAllWaitFlag(false);//UI操作待機フラグOFF
mMainModel.hideProgressCircle();// ぐるぐる非表示
}
}
// 省略
}