2014-01-16 10 views
1

Я много читал об этой проблеме в Stackoverflow, но не о том, что помогает ей работать над моей проблемой. Моя проблема в том, что мое приложение всегда останавливается на телефоне. Я хочу иметь кнопку переключателя, и если он включен, он должен вибрировать бесконечно каждые 10 секунд.Вибрация бесконечно на Android с помощью коммутатора

package com.example.myapp; 

import android.os.Bundle; 
import android.os.Vibrator; 
import android.app.Activity; 
import android.content.Context; 
import android.view.Menu; 
import android.widget.CompoundButton; 
import android.widget.CompoundButton.OnCheckedChangeListener; 
import android.widget.Switch; 

public class MainActivity extends Activity { 

    private Switch mySwitch; 
    public // Get instance of Vibrator from current Context 
    Vibrator v = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     mySwitch = (Switch) findViewById(R.id.myswitch); 

     //set the switch to off 
     mySwitch.setChecked(false); 
     //attach a listener to check for changes in state 
     mySwitch.setOnCheckedChangeListener(new OnCheckedChangeListener() { 

       @Override 
       public void onCheckedChanged(CompoundButton buttonView, 
       boolean isChecked) { 

       if(isChecked){ 
        // Start without a delay 
        // Vibrate for 100 milliseconds 
        // Sleep for 1000 milliseconds 
        long[] pattern = {0, 100, 1000}; 

        // The '0' here means to repeat indefinitely 
        // '-1' would play the vibration once 
        v.vibrate(pattern, 0); 
       }else{ 
        v.cancel(); 
       } 
       } 
     }); 
    } 

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

Благодарим за помощь!

+0

Просто, чтобы вы заметили: 10 секунд = 10000 миллис –

+1

Благодарим за помощь. Он работает! Мне пришлось использовать другой USB-порт для установки приложения на моем телефоне. – xxjaylxx

+0

Замечательно, я рад, что вам это удалось. –

ответ

0

Вы могли бы начать Thread где бы поставить что-то вроде этого в нем:

while (true) { 
    v.vibrate(500); // Half a second 
    sleep(10000); // Wait 10 seconds 
} 

Но, как это будет работать бесконечно, вам нужно также иметь какое-то условие или событие в вашей Thread к остановить его при определенных обстоятельствах (например, если действие происходит, или если BroadcastReceiver сигнал срабатывает. Подробнее here.

Более подробную информацию о останавливая Threadhere.

+0

Проблема с вашим предложением в том, что я застрял в цикле while. Я больше не могу использовать коммутатор. Мне нужно иметь метод в цикле while, который проверяет коммутатор в каждом прогоне. – xxjaylxx

+0

Насколько вы заявляете, что 'Thread' в' Деятельности' вы используете, вы сможете достигнуть 'Check', чтобы увидеть его состояние каждый раз, когда хотите. Это, вероятно, должно было бы уменьшить время сна, хотя - или отделить задачи «Проверить» в другом «потоке». – nKn

0

Мое предложение

  1. U не нужно использовать нить UI (Activity), который вы используете в настоящее время но фоновую службу.
  2. С помощью диспетчера аварийных сигналов вы можете поместить аварийный сигнал каждые 10 секунд.

он должен работать с экраном.

App Разрешение:

<uses-permission android:name="android.permission.VIBRATE"/> 
+0

Спасибо за ваш ответ. Я уже добавил разрешение. Я не уверен, что вы имеете в виду, я в самом начале с Android-программированием. – xxjaylxx

+1

Я прочитал очень приятное введение в стек о том, как все в Android является либо основной линией пользовательского интерфейса, либо фоновым потоком. http://stackoverflow.com/questions/3875184/cant-create-handler-inside-thread-that-has-not-called-looper-prepare, прочитайте mjosh ответ, поэтому, думая в своем случае, вам не нужно блокировать основное приложение, как вы хотите сделать что-то, что не связано с пользовательским интерфейсом. Надеюсь, поможет. – Abs

1

Ваша ошибка в следующей строке: общественности // Получить экземпляр Вибратор из текущего контекста Вибратор V = (Вибратор) getSystemService (Context.VIBRATOR_SERVICE);

Системные службы недоступны для вашей деятельности до вызова метода onCreate(). Итак, вы должны инициализировать свой вибратор в методе onCreate().