У меня есть 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
.
Куда я иду не так? Пожалуйста помоги. Я действительно хочу видеть, как потоки помогают в создании такого материала и постоянно меняют графический интерфейс, который когда-нибудь может помочь мне в разработке игр.
Заранее спасибо.
Я думаю, что вам нужно делать манипуляции с пользовательским интерфейсом в пользовательском интерфейсе. поместите эту часть кода в 'runOnUiThread'. –
Не могли бы вы написать для меня код? M новый для android. Но опыт с Java. Никогда не писал многопоточное приложение. –