2014-11-20 3 views
0

У меня есть Android обслуживание следующим образом:Ошибка приложения при запуске бесконечного цикла в потоке на Android.

public class TestService extends Service { 

    . 
    . 
    . // Variables 
    . 
    private Thread ChangeColors; 
    private final int[] colors = {Color.BLACK, Color.RED, Color.YELLOW, Color.BLUE, Color.GREEN}; 

    @Override 
    public void onStartCommand(Intent intent, int flags, int startID) { 

     LinearLayout layout = TestActivity.getLayout(); // Returns the layout from the activity class 
     changeColors = new Thread() { 

      int index = 0; 


      @Override 
      public void run() { 

        while(!isInterrupted()) { 

         try { 

          layout.setBackgroundColor(colors[index]); // Set the background to the Color at the index'th position in the array. 
          index ++; // Increment the index count. This will throw ArrayIndexOutOfBoundsException once the index > colors.length 
         } catch(ArrayIndexOutOfBoundsException exception) { 

          index = 0; // Then simply set the value of index back to 0 and continue looping. 
         } 
        } 
      } 
     }; 

     changeColors.start(); 
     return START_STICKY; 
    } 

    . 
    . 
    Other methods 
    . 
    . 

    @Override 
    public void onDestroy() { 

     super.onDestroy(); 
     changeColors.interrupt(); 
     Toast.makeText(this, "Stopped!", Toast.LENGTH_SHORT).show(); 
    } 
} 

Эта услуга просто получает экземпляр android.widget.LinearLayout из Activity на кнопку мыши и сохраняет изменяя LinearLayout «s цвет фона.

Это активность:

public class TestActivity extends Activity { 


    private static LinearLayout layout; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 

     layout = new LinearLayout(this); 
     layout.setOrientation(LinearLayout.VERTICAL); 
     layout.setLayoutParams(new LinearLayout.LayoutParams(

      LinearLayout.LayoutParams.FILL_PARENT, 
      LinearLayout.LayoutParams.FILL_PARENT 
     )); 

     Button butt = new Button(this); 
     butt.setText("Start thread!"); 
     button.setLayoutParams(new LinearLayout.LayoutParams(

      LinearLayout.LayoutParams.FILL_PARENT, 
      LinearLayout.LayoutParams.WRAP_CONTENT 
     )); 


     layout.addView(butt); 
     setContentView(layout); 


     butt.setOnClickListener(

      new View.OnClickListener() { 

       @Override 
       public void onClick(View view) { 

        butt.setBackgroundColor(Color.BLACK); 
        startService(getContextBase(), TestService.class); 
       } 
      } 
     ); 

     // I have another button coded here which on clicking calls the stopService() method. 
    } 



    public static LinearLayout getLayout() { 

     return layout; 
    } 
} 

Программа, кажется, довольно просто. Приложение просто отлично работает на моем телефоне LG-L90. Но как только я нажимаю кнопку butt, цвет butt изменяется на черный, и приложение сразу же срабатывает, не запуская петлю в Service.

Куда я иду не так? Пожалуйста помоги. Я действительно хочу видеть, как потоки помогают в создании такого материала и постоянно меняют графический интерфейс, который когда-нибудь может помочь мне в разработке игр.

Заранее спасибо.

+0

Я думаю, что вам нужно делать манипуляции с пользовательским интерфейсом в пользовательском интерфейсе. поместите эту часть кода в 'runOnUiThread'. –

+0

Не могли бы вы написать для меня код? M новый для android. Но опыт с Java. Никогда не писал многопоточное приложение. –

ответ

0

вы должны использовать runOnUiThread для манипулирования пользовательским интерфейсом.

public class MyService extends Service { 

    Handler handler; 

    public MyService() { 
    } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     handler = new Handler(); 
    } 

    private void runOnUiThread(Runnable runnable) { 
     handler.post(runnable); 
    } 

    ... 
} 

и убедитесь, что вы импортировали android.os.Handler, теперь называют runOnUiThread метод.

+0

runOnUiThread() - метод в 'android.app.Activity'. Есть ли способ вызвать его из 'android.app.Service'? –

+0

см. Мой обновленный ответ. вы должны использовать [Обработчик] (http://developer.android.com/reference/android/os/Handler.html) –

+0

Нет. Не работает –