2016-07-15 44 views
0

我的问题是,如果地点事件监听器(内部方法changestatus())在发生单击事件后继续执行,或者只调用一次。是继续“运行”的方法

public void onClick(View v) { 
    if (b1.getText()=="Start" && name!=null) { 
     b1.setText("Stop"); 
     inte.barstatus(); 
     inte.respond("Trying to find buildings near you"); 
     changestatus(); 
     Toast.makeText(getActivity(), "You have to get close to another building.", Toast.LENGTH_LONG).show(); 
    } 
    else if (b1.getText()=="Start"){ 
     b1.setText("Stop"); 
     inte.barstatus(); 
     inte.respond("Trying to find buildings near you"); 
     changestatus(); 
    } 
    else{ 
    b1.setText("Start"); 
    inte.barstatus2(); 
    inte.respond("Press Start button to find buildings near you"); 
      } 
} 
public void changestatus(){ 
     placeEventListener = new PlaceEventListener() { 
      @Override 
      public void onVisitStart(Visit visit) { 
       super.onVisitStart(visit); 
       name = visit.getPlace().getName().toString(); 
       switch (name) { 
        case "test1": { 
         inte.respond(name.toString()); 
         inte.barstatus2(); 
         ToneGenerator toneG = new ToneGenerator(AudioManager.STREAM_ALARM, 100); 
         toneG.startTone(ToneGenerator.TONE_CDMA_ALERT_CALL_GUARD, 200); 
         break; 
        } 
        case "test2": { 
         inte.respond(name.toString()); 
         inte.barstatus2(); 
         ToneGenerator toneY = new ToneGenerator(AudioManager.STREAM_ALARM, 100); 
         toneY.startTone(ToneGenerator.TONE_CDMA_ALERT_CALL_GUARD, 200); 
         break; 
        } 
        case "Joylamp": { 
         inte.respond(name.toString()); 
         inte.barstatus2(); 
         ToneGenerator toneT = new ToneGenerator(AudioManager.STREAM_ALARM, 100); 
         toneT.startTone(ToneGenerator.TONE_CDMA_ALERT_CALL_GUARD, 200); 
         break; 
        } 
       } 
      } 
     }; 

............................................ ............ 我希望你能理解我的问题。 感谢

编辑 我忘了这部分代码,这是内部changestatus()方法:

placeManager = PlaceManager.getInstance(); 
     placeManager.addListener(placeEventListener); 
     placeManager.startMonitoring(); 
     CommunicationManager.getInstance().startReceivingCommunications(); 

回答

0

您正在创建一个PlaceEventListener,但你不将其分配给PlaceManager(如placeManager.addListener(placeEventListener);

这样,在方法changestatus()被执行并完成后,您的placeEventListener可以被垃圾收集器收集(因为没有人引用它)。

我相信你的placeEventListener永远不会收到任何事件。

UPDATE

你更新你的问题......

现在,我们可以看到,placeEventListener意愿仍然活着,并接收事件。因此,它会持续运行,直到调用placeManager.getInstance().removeListener()

如果不删除,它,它就会一直运行的placeManager()仍然活着......所以,我建议,以提高你的代码添加一些条件,停止监听事件...类似于:

public class TestClass extends Activity { 
    private PlaceEventListener placeEventListener; 


    public void changestatus(){ 
     if(placeEventListener == null) { 
      placeEventListener = new PlaceEventListener() { 
       @Override 
       public void onVisitStart(Visit visit) { 
        super.onVisitStart(visit); 
        .... 
        ... 
       } 
      } 

      CommunicationManager placeManager = PlaceManager.getInstance(); 
      placeManager.addListener(placeEventListener); 
      placeManager.startMonitoring(); 
      placeManager.startReceivingCommunications(); 
     } 

    } 

    /* 
     Remember to add conditions to stop monitoring... 
     Otherwise, you listener will remains running even when you no longer need. 
     Also, placeManager is a static method.. so, it last longer than your activity/class... 
     If you don't remove your listener when your object/activity is being destroyed, you can induce memory leaks 

     So, if you add a listener, remember to remove it 
    */ 
    @Override 
    public void onDestroy() { 
     if(placeEventListener != null) { 
      CommunicationManager placeManager = PlaceManager.getInstance(); 
      placeManager.removeListener(placeEventListener); 
      placeManager.stopMonitoring(); 
      placeManager.stopReceivingCommunications(); 
     } 

     super.onDestroy(); 
    } 
} 
+0

....看到编辑请...是好的吗? @Guilherme P –