2013-08-21 47 views
6

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!

+0

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

+0

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

+0

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

Trả lời

1

Nghe có vẻ như tôi đang bị treo trong số AsyncTask. Trong các phiên bản hiện đại của Android AsyncTask s chạy trên một chuỗi trừ khi bạn chỉ định Executor là đa luồng. onPreExecute() vẫn chạy thành công vì chạy trên luồng chính. Bạn không bao giờ thấy doInBackground lần thứ hai mặc dù vì chuỗi nền đơn vẫn bị treo từ cuộc gọi đầu tiên. Bạn sẽ cần phải kiểm tra nội dung của LocalKeekLauncherFragment.setFragment(fragment) để xem điều gì gây ra sự cố.

+0

Trên thực tế 2 dòng chuyển đổi mảnh đó được cho là nằm trong onPostExecute() .Tôi đã chỉnh sửa mã ... trong lần thử đầu tiên, onPreExecute(), doInBackgroiund(), onPostExecute() chạy. trên lần thử thứ hai, chỉ onPreExecute() chạy .. Nếu onPostExecute() chạy trên lần thử đầu tiên, nó có nghĩa là AsyncTask không treo trên đầu tiên thử không? – user2062024

+0

Tôi đồng ý với bạn rằng AsyncTask của tôi bị chặn vì tôi phát hiện ra rằng sau khi tôi chạy lần thứ hai, tất cả các phần khác mà AsyncTask.execute() ngừng hoạt động. – user2062024

+0

Tôi đã kiểm tra trạng thái của asyncTask trước khi thực hiện nó và nó có vẻ ổn trong lần thử thứ hai .. – user2062024

0

Dường như doInBackground chủ đề có lẽ bị rơi time.It thứ hai không thể vẫn bị mắc kẹt từ đầu tiên thử như onPostExecute được gọi và điều này chỉ có thể nếu doInBackground đã trở lại giá trị thành công.

Các vấn đề liên quan