如何在Android Studio中创建新线程?

3

我有以下片段类:

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());

    }
}

如何将玩家货币的UI显示更新放在单独的线程上运行?由于后台有许多不同的进程在运行,这个线程会出现延迟和问题。为了避免这种情况,我该如何将其放在单独的线程上运行?

编辑:我尝试过类似以下的方式:

        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);

但是它并没有起到帮助的作用!

谢谢!


1
可能是如何在Android上运行后台线程上的代码?的重复问题。 - George Z.
创建一个异步任务,你就可以开始了。 - Thrishool MSM
首先,postDelayed并不会创建新的线程,它只是在延迟时间后运行run块中的代码。其次,你可以使用AsynTask、Thread、RxJava或者尝试新添加的WorkManager。 - Bali
1个回答

9

我遇到了同样的问题。

我的解决方法是创建3个可运行对象,并在onCreate()方法中启动它们。

代码如下:

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

为了创建可运行的“对象”,只需执行以下操作:
Runnable runnable = new Runnable(){
    public void run() {   
       //some code here
    }
}; 

如果您需要延迟执行一些操作,可以使用runnable接口中的postDelayed()函数(注意,postDelayed()会重复运行整个runnable。您可以通过添加一些条件来避免这种情况)。
Runnable runnable = new Runnable(){
    public void run() {   
       //some code here
       handler.postDelayed(this, 1000);
    }
}; 

如果您想更新GUI,请在runnable内调用以下命令:
handler.post(new Runnable() {
     @Override
     public void run () {
     // upate textFields, images etc...

     }
});

顺便说一句,如果您有多个线程,并且它们必须在不同的时间启动,则可以从Runnable中启动它们。

以下页面可能有所帮助:

new Runnable()但没有新线程?

Thread start()和Runnable run()有什么区别?

如何在Android上以定义的时间间隔运行Runnable线程?

何时使用handler.post()和何时使用new Thread()


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接