При запуске приложения для тестирования оно вылетает

Рейтинг: -1Ответов: 1Опубликовано: 13.01.2023

Всем привет! я написал небольшой тестовый код, хотел попробовать сделать чтобы в TextView по очереди вводились буквы из массива, а потом удалялись.

Так как реализация с таймером мне вообще не понравилась, сделал так чтобы класс выполнялся в другом потоке, и когда нужно я его останавливаю.

только вот при тесте приложение вылетает + в сохраненной версии мой чудо код не работает Не совсем понимаю в чем может быть проблема, буду благодарен любому совету!

public class Class1 extends Thread {

MainActivity Ma = new MainActivity(); //объявил класс где распологается TextView который буду изменять


private int TimeToWriteWord = 250;
private int TimeToDeleteWord = 150; // Переменные для остоновки потока, при написании слова, паузе, и удалении
private int Wait = 750;


String[] Eng = { "", "H", "E", "L", "L", "O", "!" };

String[] Fr = { "", " B", "O", "N", "J", "O", "U", "R", "!" };

String[] Spn = { "", "P", "R", "О", "S", "P", "E", "R", "A", "D", "L", "O", "!" };

String[] Nem = { "", "G", "U", "T", "E", "N", " ", "T", "A", "G", "!" }; //Массивы с словами

String[] Chin = { "", "你", "好", "!" };

String[] Kor = { "", "안", "녕", "하", "세", "요", "!" };

String[] Ita = { "", "S", "A", "L", "V", "E", "!" };



String HolowWord; //Пустое слово в которое буду добавлять буквы из массива


public void run(){
    Random rnd = new Random();
    int a = rnd.nextInt( 8); /*Создаю рандомное число на основе которого
                                    будет выводится слово на другом язые*/
    switch (a){
        case 1: word(this.Eng); break;

        case 2: word(this.Fr); break;

        case 3: word(this.Spn); break;

        case 4: word(this.Nem); break;

        case 5: word(this.Chin); break;

        case 6: word(this.Kor); break;

        case 7: word(this.Ita); break;

    }
}

public void word(String[] arr) // Метод который принимает массив с словом
{


    for(int i = 0; i < arr.length; i++)
    {
        this.HolowWord += arr[i];               //Добавляет по новой букве в прееменную, потом в TextVieW
        Ma.TextBaba.setText(this.HolowWord);    //TextBaba это название TextView ^|^

        StopThreadForAWhile(TimeToWriteWord);
    }

    StopThreadForAWhile(Wait);
    this.HolowWord = "";

    for(int i = arr.length; i > 0; i--)
    {
        for(int j = 0; j < arr.length; j++)
        {
            if (j < i)
            {
                this.HolowWord += arr[j];
                Ma.TextBaba.setText(this.HolowWord);
            }
        }
        StopThreadForAWhile(TimeToDeleteWord);
        this.HolowWord = "";
    }

}

private void StopThreadForAWhile(int Time){
    try {
        Thread.sleep(Time);
    } catch (InterruptedException ex) {
        ex.printStackTrace();
    }
}

}

Ответы

▲ 0Принят

Вы делаете многое очень неправильно)

  1. Вы вручную создаёте активити, тогда как в андроиде она всегда создаётся системой, не имеет смысла её создавать самостоятельно, она не будет работать. Судя по всему вы рассчитывали, что так вы будете использовать созданную системой актвиити. Это не так. Наверное, вам надо, например, передать активити настоящую в ваш класс через конструктор, например.
  2. Вы пытаетесь взаимодейтствовать с View не из главного потока. Так делать нельзя. Вам придётся эти операции так или иначе через главный поток делать.
  3. Вы именуете переменные с большой буквы - это очень мешает читать код, не надо так)

В итоге, наверное, вы зря отказались от варианта с таймером.