当前位置: 首页 > 知识库问答 >
问题:

如何制作一个新的线程,Android Studio?

牧璞
2023-03-14

我有以下片段类:

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个答案

芮星海
2023-03-14

我也遇到过同样的问题。

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

看起来是这样的:

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

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

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

如果您想要一些延迟操作,可以在runnable接口中使用post delayed(注意,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...

     }
});

P、 如果您有多个线程,并且它们必须在不同的时间启动,那么您可以从Runnable启动它们。

一些有帮助的页面:

新的Runnable()但没有新线程?

线程start()和Runnable run()有什么区别

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

何时使用handler.post()

 类似资料:
  • 请参阅下面的代码: \n不在这方面工作

  • 我试图理解fork-join的窃取部分。fork-join池具有具有自己Deque的工作线程。如果工作线程自身的deque为空,则该线程从另一个工作线程中窃取。 线程如何访问其他线程的状态? 当所有者线程和窃取者线程尝试访问取消排队中的同一项目时,它不会产生同步问题吗?

  • 我必须创建一个新的类来创建一个全新的PaintComponent()吗?或者我会简单地创建一个新的Graphics2D对象,这样我就可以使用不同的字体、颜色等等?我想最让我困惑的是我不能调用不同的draw方法,因为我仍然需要传递g2d作为参数。因此,在我看来,我需要从另一个已经有g2d对象的方法中创建线程。 如果这让我感到困惑,我很抱歉,因为我仍然是Java的初学者。如果你需要更多的信息,尽管告诉

  • 问题是这样的: 我有一个摆动应用程序正在运行,在某一点上,一个对话框需要插入用户名和密码并按“确定”。 我希望当用户按“确定”时,摆动应用程序按以下顺序执行: 打开“请稍候”JDialog 进行一些操作(最终显示一些其他JDialog或JOptionPane) 操作完成后,关闭“please wait”(请等待)JDialog 这是我在okButtonActionPerformed()中编写的代码

  • 问题内容: 我在Java中的线程上有些挣扎,我有三个线程- 线程1,线程2和线程3。那些启动时正在执行某些任务,我想通过thread1停止这两个线程。我将thread1放在,然后停止两个线程,但是两个线程的进程仍在运行。你有什么想法吗? 问题答案: 您如何试图阻止他们??警告此方法已弃用。 而是考虑对线程1使用某种标志来与线程2和3通信,它们应该停止。实际上,您可能会使用interrupts。 下

  • 问题内容: 我正在使用SWT编写桌面应用程序。从另一个线程更新GUI控件的最简单方法是什么? 问题答案: 根据需要使用Display.asyncExec或Display.syncExec。 例如,另一个线程可能调用此方法来安全地更新标签: 这里更多