PJL đã đúng. Tôi đã sử dụng đề nghị của anh ấy và đây là những gì tôi đã làm:
các biến toàn cục được xác định cho đoạn:
private final Object attachingActivityLock = new Object();
private boolean syncVariable = false;
thực hiện
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
synchronized (attachingActivityLock) {
syncVariable = true;
attachingActivityLock.notifyAll();
}
}
3. Tôi đã kết thúc chức năng của mình, nơi tôi cần gọi getActivity (), trong luồng, bởi vì nếu nó chạy trên luồng chính, tôi sẽ chặn luồng với bước 4. và onAttach () sẽ không bao giờ được gọi.
Thread processImage = new Thread(new Runnable() {
@Override
public void run() {
processImage();
}
});
processImage.start();
4 . trong hàm của tôi, nơi tôi cần gọi getActivity (), tôi sử dụng hàm này (trước lệnh gọi getActivity ())
synchronized (attachingActivityLock) {
while(!syncVariable){
try {
attachingActivityLock.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Nếu bạn có một số cập nhật UI, hãy nhớ chạy chúng trên luồng UI. Tôi cần cập nhật ImgeView vì vậy tôi đã làm:
image.post(new Runnable() {
@Override
public void run() {
image.setImageBitmap(imageToShow);
}
});
getActivity()
. Ngoài ra, làm thế nào bạn bắt đầu các mảnh? Bạn có nó trong layout.xml của bạn không?