#android #multithreading #android-activity #android-asynctask #android-thread
#Android #многопоточность #android-активность #android-asynctask #android-поток
Вопрос:
Как я могу получить результат AsyncTask, чтобы начать с этого другое действие? Кажется, это очень неудобно для AsyncTask… Теперь, перед завершением onPostExecute, он запускает действие без результата. Как это может подождать, пока оно не завершится, без необходимости переписывать весь код?
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);
}
}
Комментарии:
1. я бы лично посоветовал найти что-то еще для использования, асинхронные задачи немного устарели и (насколько я знаю) на самом деле они устарели
2. Да, к сожалению, я это знаю. Что бы вы предложили использовать в Java, я использую его с Room, пока полностью не изучу Kotlin. Но теперь мне это нужно, чтобы приступить к работе.
Ответ №1:
Инициализировать значение codeId
сверху как
private int codeId = -1;
Затем внутри onViewCreated
измените свое условие как:
if (codeId != -1){
create("save data");
Intent intent = new Intent(mContext.getApplicationContext(), NextActivity.class);
intent.putExtra("code_id", codeId);
mContext.startActivity(intent);
}
Теперь все должно работать нормально.
Комментарии:
1. Я забыл упомянуть, что этот метод create() находится в прослушивателе нажатия кнопки: binding.createFormSaveButton.setOnClickListener(… create(«сохранить данные»); ); вот почему это проблема.
2. Не сохраняйте его, если ваш CodeID не установлен. Итак, для этого инициализируйте CodeID = -1 и внутри вашего прослушивателя кликов сохраняйте только в том случае, если он не равен -1.
3. Обновлено, пожалуйста, проверьте.
4. Спасибо! Мне нужно было провести рефакторинг кода, но это помогло.