2014-09-29 66 views
-1

我的android應用必須與服務器通信。一個活動因此創建一個意圖並啓動一個IntentService派生。Android:爲什麼ResultReceiver參考消失?

以下是一些提示,例如this one,我擴展了ResultReceiver來處理答案: 我的活動實現了包含的Receiver接口(從而實現了onReceiveResult)。

public class MyResultDistributor extends ResultReceiver { 

// Class instances serves one purpose: To remember who gets the answer. 
private Receiver mReceiver; 

// Constructor: Apparently, the "handler" determines in which thread the result handling is done. 
public MytResultDistributor(Handler handler) { 
    super(handler); 
} 

// This is what the receiver of request answers has to implement. 
public interface Receiver { 
    public void onReceiveResult(int resultCode, Bundle resultData); 
} 

// Allows to clarify who is the receiver of request results. 
public void setReceiver(Receiver receiver) { 
    if (receiver != null) { 
     Log.d(this.getClass().toString(), "Setting receiver."); 
    } else { 
     Log.d(this.getClass().toString(), "Unsetting receiver."); 
    } 
    this.mReceiver = receiver; 
    if (this.mReceiver != null) { 
     Log.d(this.getClass().toString(), "Set receiver."); 
    } else { 
     Log.d(this.getClass().toString(), "Unset receiver."); 
    } 
} 

@Override 
protected void onReceiveResult(int resultCode, Bundle resultData) { 
    // Anybody interested in the results? Well, then feel free to take them. 
    Log.d(this.getClass().toString(), "Got result."); 
    if (this.mReceiver != null) { 
     Log.d(this.getClass().toString(), "Distributing result."); 
     this.mReceiver.onReceiveResult(resultCode, resultData); 
    } else { 
     Log.d(this.getClass().toString(), "No receiver there."); 
    } 
} 

活動創造了這樣一個實例,並且將其自身設置接收器(節選):

public class MainActivity extends Activity implements MyResultDistributor.Receiver { 

public MyResultDistributor mDistributor; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    Log.v(this.getClass().toString(), "onCreate"); 
    setContentView(R.layout.activity_main); 

    mDistributor = new MyResultDistributor(new Handler()); 
    mDistributor.setReceiver(this); 

    (...) 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    Log.v(this.getClass().toString(), "onPause"); 
    mDistributor.setReceiver(null); 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    Log.v(this.getClass().toString(), "onResume"); 
    mDistributor.setReceiver(this); 
} 

(...) 

現在,當我運行的活動,開始我的服務,並返回結果,它似乎mReceiver爲空。但我看不到它在日誌中設置爲空的位置!

日誌摘錄:

onCreate 
Setting receiver. 
Set receiver. 
onResume 
Setting receiver. 
Set receiver. 
Request Service was created. 
Request Service has got an Intent. 
Server answer: auth 
Authenticated! 
Got result. 
No receiver there. 

,其中最後5個消息設有不同的TID。

爲什麼接收器出現在一個方法中設置和另一個未設置?我有線程問題嗎?可能通過使用new Handler()做錯了嗎?

謝謝你的提示!

回答

1

好的我認爲我發現我的錯誤: 我以某種方式將錯誤的接收者傳遞給了我的IntentService - 因此我正在觀看的實例是一個不同的接收者。 對不起這個無法解決的問題...(因爲代碼部分沒有顯示。)。