2012-10-09 4 views
1

30 초마다 진동 및 경고음이 울리는 응용 프로그램을 만들고 있는데 진동판을 로그 아웃하고 경고음을 취소해야하며 로그인 할 때 진동 및 경고음이 다시 발생해야합니다.타이머를 취소하고 동일한 타이머를 갱신하는 방법은 무엇입니까?

참고 : 나는이 사용하는 진동과 경고음 코드입니다이 구현

에 대한 TimerTask을 사용하고 내 응용 프로그램에서

을 로그 아웃 할 때까지 매 30 초 동안 진동과 경고음해야한다 TimerTask

static TimerTask Task; 
final static Handler handler = new Handler(); 
static Timer t = new Timer(); 

public static void vib() { 

    Task = new TimerTask() { 
     public void run() { 
      handler.post(new Runnable() { 
       public void run() { 
        Vibrator vibrator = (Vibrator) ApplicationUtils.getContext().getSystemService(Context.VIBRATOR_SERVICE); 
        vibrator.vibrate(3000); 
        playSound(); 
        Log.d("TIMER", "Timer set on"); 
       } 
      }); 
     } 
    }; 
    t.schedule(Task, 0, 30000); 
} 
내가 로그 아웃 절에서 사용하고 코드입니다

public void stopvib() { 
    if (Task != null) { 
    // Log.d("TIMER", "timer canceled"); 
     t.cancel(); 
     Task.cancel(); 
    } 
} 

참고 : 나는 또한 Task.cancel();을 제거하지만 여전히 내가 같은 오류를 로그 아웃하기 전에 잘 작동

내 진동을 얻고 다시 내가 어떤 일이 코딩 나를 도울 수있는 오류를

java.lang.IllegalStateException: Timer was cancelled 
    at java.util.Timer.scheduleImpl(Timer.java:562) 
    at java.util.Timer.schedule(Timer.java:481) 
    at com.vib(AlertListActivity.java:724) 

을에 geting하고 로그인합니다. 나는 어디로 잘못 갔는가?

답변

3

최근에이 코드를 실행하여 정상적으로 작동하고 있습니다. 이 달성 될 수있다하여 방송 Receiver.You은 TimerTask를 확장하는 별도의 CustomTimer 작업을 구현해야한다 : 당신이 방송은 "VIB()"방법을 구현하려는 클래스에서 수신 구현해야 이후

Activity mActivity=null; 
public MyCustomTimer(Activity mActivity) { 
    this.mActivity=mActivity; 
} 
    @Override 
    public void run() { 
     this.mActivity.runOnUiThread(new Runnable() { 

      @Override 
      public void run() { 
       Toast.makeText(mActivity, "Write you code here",Toast.LENGTH_LONG).show(); 
       Log.d("MyCustomTimer","Call"); 
      } 
     }); 

    } 

를 : 시작하거나이 라인을 구현하여 진동을 중지 할 수 있습니다, 지금

public class MainActivity extends Activity { 
    private MyCustomTimer myCustomTimer = null; 
    BroadcastReceiver mBr_Start = new BroadcastReceiver() { 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      if (intent.getAction().equals("START_VIBRATION")) { 
       System.out.println("onreceive :START_VIBRATION"); 
       vib(); 
      } 
     } 
    }; 
    BroadcastReceiver mBr_Stop = new BroadcastReceiver() { 

     @Override 
     public void onReceive(Context context, Intent intent) { 
      if (intent.getAction().equals("STOP_VIBRATION")) { 
       stopVibration(); 
      } 
     } 
    }; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     IntentFilter mIntentFilter = new IntentFilter(); 
     mIntentFilter.addAction("START_VIBRATION"); 
     registerReceiver(mBr_Start, mIntentFilter); 
     IntentFilter mIntentFilter2 = new IntentFilter(); 
     mIntentFilter2.addAction("STOP_VIBRATION"); 
     registerReceiver(mBr_Stop, mIntentFilter2); 

     Button b1 = (Button) findViewById(R.id.button1); 
     b1.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       Intent i = new Intent(MainActivity.this, MySecondActivity.class) 
         .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
       startActivity(i); 

      } 
     }); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.activity_main, menu); 
     return true; 
    } 

    private void vib() { 
     myCustomTimer = new MyCustomTimer(MainActivity.this); 
     Timer timer = new Timer(); 
     timer.scheduleAtFixedRate(myCustomTimer, 0, 30000); 
    } 

    private void stopVibration() { 
     Log.d("MainActivity", "Before Cancel"); 
     if (null != myCustomTimer) 
      myCustomTimer.cancel(); 
     Log.d("MainActivity", "After Cancel"); 
    } 

} 

: (단지 예를 들어) 내 경우에는, 가정 해 봅시다은 MainActivity입니다

Intent i=new Intent("START_VIBRATION"); 
       mActivity.sendBroadcast(i); 
: 진동을 시작하려면

는 중지하려면 :

Intent i=new Intent("STOP_VIBRATION"); 
       mActivity.sendBroadcast(i); 

참고 : MainActivity의 들의 OnDestroy()을 (귀하의 경우, 당신은 브로드 캐스트 리시버 등록 취소 방송 수신기 구현에.) 설정 타이머 인스턴스가 유 BCZ 나를 도울 수

+0

업데이트 : MyCustomTimer의 run() 메소드에서 playSound(); –

0

사용자가 로그 아웃 할 때 타이머 인스턴스를 null로 설정하고 사용자가 앱에 로그인 할 때마다 초기화합니다. 이렇게하면 "타이머가 취소되었습니다"관련 문제가 해결됩니다.

+0

내가 new to android – Jagan

+0

나는 t = null을 사용했습니다; 하지만 난 java.lang.NullPointerException 오류가 발생했습니다. 로그인 plz 도와주세요 – Jagan

0

정적 TimerTask가 필요한 이유는 무엇입니까? 내게 잘 작동하는 이유는 무엇입니까?

timer.schedule(new TimerTask() { 
     @Override 
     public void run() { 
     //your code 
     } 
     }, 0, 30000); 

동안 로그 아웃을 사용, 여기에 timer.cancel(). 은 단순히 timer.No을 취소 할 수는 TimerTask를 취소해야합니다.

+0

내가 다른 클래스에 vib() 메소드를 호출하고 싶습니다 – Jagan

+0

그 yi는 static timertask를 사용했습니다 – Jagan

+0

그러나 한 응용 프로그램에서만 모든 타이머를 활성화해야합니다 ?그렇다면 정적 메서드를 호출 할 수 있습니다 어디서나 결국은 새로운 TimerTask 매번 .. 타이머 당신은 그것을 정적으로두고 떠날 수있는 어디서나 응용 프로그램에서 timer.cancel()를 사용합니다. 그것은 작동합니다. .. – hacker