How can I get the AsyncTask's result to start another activity with that? It seems very uncomfortable this AsyncTask... Now, before onPostExecute finishes, it starts activity without the result. How can that wait until it finishes without to have to rewrite the whole code?
public class MainFragment extends Fragment implements InsertAsyncTask.AsyncInsertTaskCompleteListener {
private Repository mRepository;
private String data;
private int codeId;
private int editMode = 0;
private Context mContext;
private FragmentMainBinding binding;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mContext = this.getContext();
mRepository = new Repository(mContext);
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.mainfragment, container, false);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
binding = FragmentMainBinding.bind(view);
binding.createFormSaveButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String text = binding.codeCreateFormTextInput.getText().toString().trim();
if (!text.equals("")){
create("save data");
Intent intent = new Intent(mContext.getApplicationContext(), NextActivity.class);
intent.putExtra("code_id", codeId);
mContext.startActivity(intent);
}
}
}
private void create(String data){
if (editMode == 1){
//updated data to DB
updateCode(data);
} else {
//save data to DB
save(data);
}
}
public void save(String data){
mRepository.insertTask(data, MainFragment.this);
}
@Override
public void onInsertTaskComplete(long[] id) {
if (id[0] > 0){
codeId = (int) id[0];
}
}
}
Repository.java:
public void insertTask(String data, InsertAsyncTask.AsyncInsertTaskCompleteListener mListener) {
new InsertAsyncTask(myDatabase.getCDao(), mListener).execute(data);
}
InsertAsyncTask.java:
public class InsertAsyncTask extends AsyncTask<String, Void, Long> {
private static final String TAG = "InsertAsyncTask";
private cDao mCDao;
private AsyncInsertTaskCompleteListener callback;
private long[] insertId;
public InsertAsyncTask(CDao dao, AsyncInsertTaskCompleteListener cb) {
mCDao = dao;
this.callback = cb;
}
@Override
protected void onPostExecute(Long aLong) {
super.onPostExecute(aLong);
if (callback != null) {
callback.onInsertTaskComplete(insertId);
}
}
@Override
protected Long doInBackground(String... datas) {
insertId = mCDao.insertCode(datas);
return null;
}
public interface AsyncInsertTaskCompleteListener {
void onInsertTaskComplete(long[] id);
}
}
Initialise value of codeId
on top as
private int codeId = -1;
Then inside onViewCreated
change your condition as:
if (codeId != -1){
create("save data");
Intent intent = new Intent(mContext.getApplicationContext(), NextActivity.class);
intent.putExtra("code_id", codeId);
mContext.startActivity(intent);
}
Should work fine now.