2014-09-29 33 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 - 因此我正在观看的实例是一个不同的接收者。 对不起这个无法解决的问题...(因为代码部分没有显示。)。