Как создать новую ветку Android Studio?

У меня есть следующий класс фрагмента:

public class fragment1 extends Fragment {
    private TextView bunz_count;
    private TextView money_count;
    private Bunz bunz;
    private Handler handler;
    int delay = 1000;
    View view;
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        bunz = Bunz.getInstance();
        handler = new Handler();


        view = inflater.inflate(R.layout.fragment1, container, false);


        handler.postDelayed(new Runnable(){
            public void run(){
                update(view);
                handler.postDelayed(this, delay);
            }
        }, delay);







        return view;
    }


    public void update(View view){
        bunz_count = (TextView) view.findViewById(R.id.final_bunz_count);
        money_count = (TextView) view.findViewById(R.id.final_money_count);
        //System.out.println(bunz.getBaker1());


        BigDecimal number = ((BigDecimal.valueOf
                (bunz.getBaker1()).multiply(BigDecimal.valueOf(.1))));
//        ).add((BigDecimal.valueOf(bunz.getBaker2()).multiply(BigDecimal.valueOf(.2)))).
//                add((BigDecimal.valueOf
//                        (bunz.getBaker3()).multiply(BigDecimal.valueOf(.4)))).
//                add((BigDecimal.valueOf
//                        (bunz.getBaker4()).multiply(BigDecimal.valueOf(.8)))).
//                add((BigDecimal.valueOf(bunz.getBaker5()).multiply(BigDecimal.valueOf(1)))).
//                add((BigDecimal.valueOf(bunz.getBaker6()).multiply(BigDecimal.valueOf(2)))).
//                add((BigDecimal.valueOf(bunz.getBaker7()).multiply(BigDecimal.valueOf(4)))).
//                add((BigDecimal.valueOf(bunz.getBaker8()).multiply(BigDecimal.valueOf(5)))).
                //add((BigDecimal.valueOf(bunz.getBaker9()).multiply(BigDecimal.valueOf(10))));
        //System.out.println(number);
        bunz.setBunz(bunz.getBunz().add((number)));
        bunz_count.setText("Bunz: " + bunz.getBunz());
        money_count.setText("Money: " + bunz.getMoney());
        System.out.println("bunz" + bunz.getBunz());

    }
}

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

Изменить: я пробовал что-то вроде этого:

        mHandlerThread = new HandlerThread("yeye");
        mHandlerThread.start();
        handler = new Handler(mHandlerThread.getLooper());
        handler.postDelayed(new Runnable(){
            public void run(){
                update(view);
                handler.postDelayed(this, delay);
            }
        }, delay);

но это не помогло!

Спасибо!


person Evan    schedule 28.08.2019    source источник
comment
Возможный дубликат Как запустить код на фоновая ветка на Android?   -  person George Z.    schedule 28.08.2019
comment
Создайте задачу Async, и все готово   -  person Thrishool MSM    schedule 28.08.2019
comment
Прежде всего, postDelayed не создает новый поток, он просто запускает фрагмент кода в блоке выполнения после времени задержки. Во-вторых, у вас есть AsynTask, Thread, RxJava или просто попробуйте новое дополнение WorkManager.   -  person Bali    schedule 28.08.2019


Ответы (1)


Я столкнулся с той же проблемой.

Решением моей проблемы было создание 3 исполняемых файлов и запуск их в onCreate() Методе.

Это выглядит так:

Thread thread = new Thread(runnable);
thread.start();

Чтобы создать работоспособный «объект», просто сделайте следующее:

Runnable runnable = new Runnable(){
    public void run() {   
       //some code here
    }
}; 

Если вам нужно какое-то отложенное действие, вы можете работать с отложенной публикацией в исполняемом интерфейсе (будьте осторожны, postDelayed() просто повторит весь runnable. Вы можете избежать этого, добавив некоторые условия)

Runnable runnable = new Runnable(){
    public void run() {   
       //some code here
       handler.postDelayed(this, 1000);
    }
}; 

Если вы хотите обновить графический интерфейс, вы должны вызвать следующую команду в своем runnable:

handler.post(new Runnable() {
     @Override
     public void run () {
     // upate textFields, images etc...

     }
});

P.S. Если у вас несколько потоков, и они должны запускаться в разное время, вы можете запустить их из Runnables.

Некоторые страницы, которые могут быть полезны:

new Runnable (), но нет нового потока?

В чем разница между Thread start () и Runnable run () < / а>

Как запустить исполняемый поток в Android при определенном интервалы?

Когда использовать handler.post () и когда переходить в новый поток ( )

person Dmytro    schedule 02.09.2019