Android AsyncTask - почему doInBackground() не выполняется?

У меня есть вложенный фрагмент, содержащий следующий метод:

public void onSave() {
 if (getActivity() == null || view == null) return;
 if (file != null && file.exists()) {
 new AsyncTask<void, void,="" void="">() {
 @Override
 protected void onPreExecute() {
 Log.d("log", "onPreExecute of save ex");
 }
 @Override
 protected Void doInBackground(Void... params) {
 Log.d("log", "doInBackground of save ex");
 //DO SOMETHING
 return null;
 }
 protected void onPostExecute(Void result) {
 BaseFragment fragment = new LocalListFragment();
 ((LocalLauncherFragment)(LocalEditFragment.this.getParentFragment())).setFragment(fragment);
 Log.d("log", "end of save ex");
 };
 }.execute();
 } else {
 showAlert();
 }
}
</void,>

Моя проблема в том, что если я вызову этот метод в первый раз, он будет выполняться до onPostExecute(). Однако, если я перейду к другому фрагменту и снова открою этот фрагмент (создав новый объект фрагмента и заменив его), то выполняется только onPreExecute(). Почему этот объект asyncTask не выполняется во второй раз?

Намеренно, если я использую executeOnExecutor(), тогда он работает нормально во второй раз. Но почему функция execute() не работает? Жизнь AsyncTask связана с фрагментом или чем-то еще?

Спасибо заранее!

2 ответа

Мне кажется, что что-то висит в AsyncTask. В современных версиях Android AsyncTask выполняется один поток, если вы не укажете Executor, который многопоточен. onPreExecute() по-прежнему выполняется успешно, потому что он работает в основном потоке. Вы никогда не видите doInBackground второй раз, хотя из-за того, что единственный фоновый поток все еще висит от первого вызова. Вам нужно изучить содержимое LocalKeekLauncherFragment.setFragment(fragment), чтобы узнать, что вызывает зависание.


Кажется, что doInBackground поток, вероятно, разбился второй раз. Он не может оставаться застрявшим от первой попытки, так как onPostExecute вызывается, и это возможно только в том случае, если doInBackground успешно вернул значение.

licensed under cc by-sa 3.0 with attribution.