Gần đây tôi đã chuyển đổi Hoạt động của tôi thành Phân đoạn.Các mảnh vỡ được thay thế trong khi AsyncTask được thực hiện - NullPointerException trên getActivity()
Sử dụng điều gì đó tương tự như Điều hướng tab các đoạn được thay thế khi người dùng chọn một tab khác. Sau khi phân đoạn được điền, tôi bắt đầu ít nhất một AsyncTask để nhận một số thông tin từ internet. Tuy nhiên - nếu người dùng chuyển sang tab khác cũng giống như các doBackground-phương pháp từ AsyncTask của tôi đang được thực hiện - đoạn được thay và do đó tôi nhận được một NullPointerException
trong dòng đánh dấu:
@Override
protected Object doInBackground(Object... params) {
...
String tempjson = helper.SendPost(getResources().getText(R.string.apiid)); //ERROR: Fragment not attached
...
}
protected onPostExecute(Object result) {
...
getActivity().getContentResolver() //NULLPOINTEREXCEPTION
getView().findViewById(R.id.button) //NULL
...
}
getActivity()
và getResources()
gây ra lỗi vì đoạn của tôi bị thay thế.
Những điều tôi đã cố gắng:
- Calling hủy phương pháp trên AsyncTask tôi (sẽ không sửa lỗi đầu tiên cũng không phải là lỗi thứ hai nếu đoạn được thay thế trong khi
onPostExecute()
được thực hiện) - kiểm tra nếu
getActivity()
lànull
hoặc gọithis.isDetached()
(không phải là một sửa chữa thực tế và tôi cần phải kiểm tra xem nó bất cứ khi nào tôi gọigetActivity()
và vân vân)
Vì vậy, câu hỏi của tôi là: những gì sẽ là tốt nhất để thoát khỏi những vấn đề AsyncTask? Tôi không có những vấn đề này khi sử dụng Hoạt động vì chúng không bị "giết"/tách ra khi thay đổi tab (dẫn đến việc sử dụng bộ nhớ cao hơn - lý do tại sao tôi muốn chuyển sang Fragments)
Bạn nên sử dụng isDetached() chỉ khi bạn tách rời chính mảnh vỡ đó. Khác, bạn nên sử dụng isAdded() để xử lý các trường hợp hệ thống hủy liên kết giữa hoạt động của bạn và đoạn của bạn. – pcans
@Nikolay Elenkov làm thế nào chu kỳ sống có thể tránh kiểm tra mọi lúc trước khi gọi điện thoại hoạt động? – Bear