2011-11-29 5 views
0

내 코드는 ... 내 수신기 (서비스를 시작하는)를 등록 및 등록 취소 (여러 번)하기 때문에 문제가 발생합니다.토글 버튼을 두 번 이상 눌러 등록/등록 해제

문제점은 다음과 같습니다. registerRceiver 및 unregisterReceiver 명령을 실행 한 후 '수신자'변수가 NULL이되는 것을 보았습니다 ... 특히 수신기를 등록 및 등록 해제 한 후 다시 등록한 후 수신기에 NULL 만있는 경우, 따라서 다시 등록을 취소하는 동안 오류가 발생합니다! 그래서 기본적으로 내 앱은 한 번 등록을 취소 한 후에 Receiver를 다시 등록 할 수 없습니다. 왜 그게 문제 야?

public class startScreen extends Activity { 
    /** Called when the activity is first created. */ 

    private BroadcastReceiver receiver=new BroadcastReceiver(){ 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Intent serviceIntent = new Intent(); 
     serviceIntent.setAction("com.example.MyService"); 
     context.startService(serviceIntent); 

    } 

    }; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.initial); 

     final IntentFilter filter = new IntentFilter(); 
     filter.addAction("android.net.wifi.STATE_CHANGE"); 



     Button button = (Button) findViewById(R.id.button1); 
     final ToggleButton toggleButton = (ToggleButton) findViewById(R.id.toggleButton1); 
     try 
    { 
       ... some code...    
     if(bool == true) 
     { 
     toggleButton.setChecked(true); 
     this.registerReceiver(receiver, filter); 
     } 
     else 
      toggleButton.setChecked(false); 
    }catch(Exception e) { 
      Log.e("Error", "Database", e); 
      } finally { 
         ... 
      } 

     toggleButton.setOnClickListener(new OnClickListener() {   
      public void onClick(View v) { 
       if((toggleButton.isChecked())) 
       { 
        getBaseContext().registerReceiver(receiver, filter); 

       } 
       else 
       { 
        if (receiver != null){ 
         getBaseContext().unregisterReceiver(receiver); 
         receiver = null; 
      } 

       } 
      } 
    }); 
    } 

    @Override 
    protected void onResume(){ 
     super.onResume(); 
       if(bool == true) 
       { 
       if(receiver == null) 
        this.registerReceiver(receiver, filter); 
       }      
    } 
    @Override 
    protected void onPause(){ 
     super.onPause(); 
    if (receiver != null){ 
     this.unregisterReceiver(receiver); 
     receiver = null; 
    } 
    } 
} 

답변

0
당신은 명시 적으로 내부 toggleButton.setOnClickListener를 null로 receiver을 설정하는

onPause의 :

receiver = null; 

그 라인을 제거 시도하고 문제를 해결할 수

+0

, 그렇게하려고합니다 확인하지만 있는지 코드의 주어진 인스턴스에서 서비스가 다시 등록되었는지 여부를 어떻게 확인할 수 있습니까? – Sid

+0

대신에 추적하는'boolean'을 저장할 수 있습니다. 그렇게하면 수신자 인스턴스를 유지 관리 할 수 ​​있습니다. – Craigy

관련 문제