Как передать результат AsyncTask другому действию?

#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. Спасибо! Мне нужно было провести рефакторинг кода, но это помогло.