Look, tôi có đoạn mã sau:Trình xử lý ảnh hưởng đến cách onReceiveResult (ResultReceiver) được gọi ra như thế nào?
Hành động của tôi:
final Intent intent = new Intent(getApplicationContext(), MyService.class)
.putExtra(UploadService.EXTRA_RESULT_RECEIVER, new ResultReceiver(null) {
@Override
protected void onReceiveResult(int resultCode, Bundle resultData) {
super.onReceiveResult(resultCode, resultData);
String result = resultData.getString(MyService.EXTRA_RESULT_SUCCESS);
...
imageView.setBackgroundDrawable(bitmap);// here my code fails
}
})
MyService:
Bundle b = new Bundle();
b.putString(EXTRA_RESULT_SUCCESS, response.toString());
resultReceiver.send(0, b);
Và ứng dụng của tôi không thành công trên dòng "imageView.setBackgroundDrawable (bitmap)" như sau ngoại lệ:
11-13 16:25:38.986: ERROR/AndroidRuntime(3586): FATAL EXCEPTION: IntentService[MyService]
android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
Nhưng doe này không xảy ra khi tôi xác định người nhận như thế này (với người xử lý):
new ResultReceiver(new Handler()){.../*here goes the same code as in the first example. nothing has been changed*/}
So. Nó không thất bại khi tôi vượt qua một Trình xử lý mặc định. Và tôi yêu cầu Lý do tại sao? Trong cả hai cách mã của tôi được gọi, nhưng khi không có Trình xử lý nào được chỉ định thì nó không thành công. Handler có ảnh hưởng gì?
Tôi có một nghi ngờ. Có phải ResultReceiver.onReceiveResult đó sẽ luôn chạy trên chuỗi không phải là UI không? –
Không, đó là việc sử dụng Trình xử lý đảm bảo rằng nó sẽ chạy đúng chuỗi. Thông thường không đảm bảo được thực hiện như là chủ đề mà người nhận sẽ được gọi là trên. – Femi
OK! Nó dựa trên thread gọi trình thu kết quả. Cảm ơn bạn đã trả lời nhanh. –