如何创建一个新线程,Android Studio?

Posted

技术标签:

【中文标题】如何创建一个新线程,Android Studio?【英文标题】:How to make a new thread, Android Studio? 【发布时间】:2020-01-01 23:59:27 【问题描述】:

我有以下片段类:

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

但它没有帮助!

谢谢!

【问题讨论】:

How can I run code on a background thread on android?的可能重复 创建一个异步任务,一切顺利 首先 postDelayed 不会创建新线程,它只是在延迟时间后运行 run 块中的一段代码。其次,你有 AsynTask、Thread、RxJava 或者只是尝试新添加的 WorkManager。 【参考方案1】:

我也遇到了同样的问题。

我的问题的解决方案是创建 3 个可运行文件并在 onCreate() 方法中启动它们。

看起来是这样的:

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

为了创建可运行的“对象”,只需执行以下操作:

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

如果您想要一些延迟的操作,您可以在可运行界面中使用延迟的帖子(注意,postDelayed() 只会重复整个可运行。您可以通过添加一些条件来避免这种情况)

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...

     
);

附:如果您有多个线程并且它们必须在不同的时间启动,您可以从 Runnables 启动它们。

一些有用的页面:

new Runnable() but no new thread?

What's the difference between Thread start() and Runnable run()

How to run a Runnable thread in Android at defined intervals?

When to use handler.post() & when to new Thread()

【讨论】:

以上是关于如何创建一个新线程,Android Studio?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Kotlin 中创建一个打开新活动(Android Studio)的按钮?

Android:如何在手机旋转后阻止创建新线程

android studio 2018.4.17 进程和线程

Android Studio学习随笔-UI线程阻塞以及优化

Android Studio:添加文件后如何“刷新”?

如何在 Android Studio 中删除存储库并添加新存储库?