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

Android线程、处理程序、HandleMessage:从外部类文件中的可运行线程更新UI线程

刁浩言
2023-03-14

背景:我正在尝试转换一个Java(非GUI)程序来运行在Android上。为了简单起见,假设这个程序有以下文件:

java,sinfer.java,main.java

public class MainActivity extends Activity {

    /* UI Elements */
    private TextView output;

    /* Thread Handler */
    private Handler uiHandler;

    /* Handle message override */
    public class UIHandler extends Handler {

        @Override
        public void handleMessage(Message msg) {
            output.append(msg.obj.toString());
            super.handleMessage(msg);
        }
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_run_fsi);

        output = (TextView) findViewById(R.id.displayTextView);
        uiHandler = new UIHandler();

        setStartButtonClickListener();

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_run_fsi, menu);
        return true;
    }


    private void setStartButtonClickListener() {
        Button startButton = (Button) findViewById(R.id.startButton);
        startButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                runFSI();

            }
        });
    }

    private void runFSI() {
        // initialize SInfer and pass uiHandler

        SInfer inferer = SInfer.getInstance(/*other variables*/, uiHandler);


        // initialize DSGen
        DSGenerator dsGen;

        Thread t1 = new Thread(dsGen);
        Thread t2 = new Thread(inferer);
        t1.start();
        t1.yield();
        t2.start();
        t2.yield();

        try {
            Thread.sleep(10000);
        } catch (Exception e) {
        }

        inferer.stop();
        dsGen.stop();

    }

}

SInfer内部定义的run方法如下(System.out代码是从原始Java代码中遗留下来的)

@Override
public void run() {

    // System.out.println("Inference: Thread started...");

    while (stopFlag == false) {
        try {
            // System.out.println("SInference: run.........");
            Thread.sleep(200);
            inferenceResult = doInference();

            /* Send result to UI thread */

            Message msg = Message.obtain(uiHandler);
            msg.obj = inferenceResult.toString();
            uiHandler.sendMessage(msg);

        } catch (InterruptedException e) {
            // System.out.println(e.getMessage());
        }
    }
}

共有1个答案

常乐
2023-03-14

您正在运行Thread.Sleep(10000);在主线程中(OnClick在UI线程中调用),所以在这10秒内UI中什么都不能更新。尝试在单独的线程中调用runFSI方法。

 类似资料:
  • 我正在编写一个Android应用程序,它连接到蓝牙设备,读取设备发送的数据,将其添加到AChartEngine图形中,并在文本视图中显示数据。 我的Bluetooth代码与BluetoothChat示例代码中的线程实现非常相似(它与SDK一起提供)。我可以在LogCat中看到< code>ConnectedThread循环正在执行并因此获得新数据,但我的TextView在7行之后停止更新,图形间歇

  • 问题内容: 我刚刚开始进行android开发,并且更新UI确实使我很烦:/ 到目前为止,这是我一直在努力的工作- 它工作正常,但是每个人都说要在主线程中做图形,所以我正在尝试(但失败)将其传递给另一个线程。麻烦的是,我真的不知道怎么做,因为我从未真正使用过线程。 Google给出的有关使用Threads的示例似乎并不十分清楚,我也无法真正按照自己的意愿去做。我可以请某人在这里给我一个最基本的例子,

  • 问题内容: 我对android完全陌生,只想知道它是否是在主线程外更新UI的任何可行且可行的方法。仅从我的代码中,我就在下面列出了这些代码;根本不可能。但是, 我只想使用另一个线程来更新UI 。请事先帮助我! 问题答案: 使用activity.runOnUiThread

  • 问题内容: 我想更改Android中的UI。 我的主类创建第二个类,然后第二个类调用主类的方法。主类中的方法应更新UI,但程序在运行时会崩溃。 我该怎么办? 我的主要班级: 还有我的第二堂课: 问题答案: 您不能从主线程以外的线程调用UI方法。您应该使用Activity#runOnUiThread()方法。

  • 问题内容: 据我所知,在android中,当我们运行进程时,它们始于Main线程。当我们做一些繁重的工作时,我们使用了一个新线程。如果我们想修改UI外观,可以使用在UI上运行。 有人可以向我解释这些线程的作用以及如何使用它们吗? 问题答案: UI线程和主线程只是同一线程的不同名称。 应用程序的所有UI膨胀都在此主线程上完成。之所以将“较重”的工作委派给其他线程,是因为我们不希望这些操作减慢UI的响

  • 我正在尝试动态更新主线程中的一个android。 不幸的是,我很难从网上的教程中找到任何东西。它们似乎都没有提供线程之间如何通信的完整图片。 我希望避免匿名类,只要有新消息,就动态创建新的。

  • 问题内容: 我想在后台线程中运行一些Runnable。我想使用Handler,因为它便于延迟。我的意思是 凡 可运行 应当运行 后台 线程。是否可以创建这样的处理程序?是否在某个地方有“背景” Looper,或者该如何创建? PS我知道如何使用自定义类扩展Thread,但是比处理程序方式需要更多的编码工作。因此,请不要发布其他解决方案或类似的内容 如果Handler能以“干净”的方式做到这一点,我

  • 我想在后台线程中运行一些Runnable。我想使用Handler,因为它方便延迟。我的意思是 runnable应该在后台线程中运行。有可能创造这样的处理器吗?某个地方有没有“背景”Looper或者我怎么才能创建它? 附言:我知道如何使用自定义类扩展Thread来做到这一点,但它需要更多的编码工作,而不是以处理程序的方式进行。因此,请不要发布其他解决方案或类似内容 我只是想知道汉德勒是否能以“干净”