Tôi có một mảnh lồng nhau có chứa các phương pháp sau đây:Android AsyncTask - tại sao doInBackground() không được thực thi?
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();
}
}
Vấn đề của tôi là nếu tôi gọi phương pháp này lần đầu tiên, nó thực hiện cho đến khi onPostExecute(). Tuy nhiên nếu tôi đi đến đoạn khác và mở đoạn này mới (bằng cách tạo một đối tượng phân mảnh mới và thay thế cho nó) thì chỉ onPreExecute() mới được thi hành. Tại sao đối tượng asyncTask này không được thực hiện tốt cho lần thứ hai?
Intestingly nếu tôi sử dụng executeOnExecutor() sau đó nó hoạt động tốt cho lần thứ hai. Nhưng tại sao không thực hiện() làm việc? Cuộc sống của AsyncTask có liên quan đến mảnh vỡ hay gì đó không?
Cảm ơn trước!
Tôi không chắc chắn về điều này, nhưng Fragments có thể có các thành phần giao diện người dùng, vì vậy tôi sẽ cẩn thận về việc làm rối tung chúng nhiều trong các chủ đề nền. Bạn đã thử đặt câu lệnh tường trình của mình làm dòng đầu tiên trong phương thức 'doInBackground' và xem nó có hiển thị không? – kabuko
yea tôi đã làm. trong lần thử đầu tiên, cả onPreExecute() doInBackground() được gọi nhưng vào lần thứ hai, chỉ onPReExeucte() được gọi là: ( – user2062024
Khi bạn đang sử dụng 'executeOnExecutor', tôi đoán bạn đang sử dụng' THREAD_POOL_EXECUTOR' chứ không phải 'SERIAL_EXECUTOR' phải không? Hãy thử với' SERIAL_EXECUTOR' và tôi cược bạn sẽ nhận được cùng một hành vi (không mong muốn) – kabuko