Fedora39的#!bash #!/bin/bash #!/bin/env bash #!/usr/bin/bash #!/usr/bin/env bash

阅读 35

2024-06-25

在这里插入图片描述

在Android中,你不能直接从子线程中更新UI,因为这会导致应用崩溃。你需要使用HandlerrunOnUiThread()来更新UI。

使用Handler

以下是如何使用Handler在子线程中更新UI的示例:

1. 创建Handler实例:
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.app.Activity;
import android.widget.TextView;

public class MainActivity extends Activity {

    private TextView textViewLog;
    private Handler handler;

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

        textViewLog = findViewById(R.id.textViewLog);
        handler = new Handler(Looper.getMainLooper());
    }

    private void updateTextView(final String text) {
        handler.post(new Runnable() {
            @Override
            public void run() {
                textViewLog.setText(textViewLog.getText() + "\n" + text);
            }
        });
    }

    private void someBackgroundTask() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                // Simulate some background work
                try {
                    Thread.sleep(2000); // Simulate some work
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                // Update the TextView with the result
                String hex = "Sample Hex Data";
                updateTextView("recv: " + hex);
            }
        }).start();
    }

    @Override
    protected void onStart() {
        super.onStart();
        someBackgroundTask();
    }
}

使用runOnUiThread

另一种方法是使用runOnUiThread(),这是一个Activity方法,它允许你在UI线程上运行代码。以下是如何使用它:

import android.os.Bundle;
import android.app.Activity;
import android.widget.TextView;

public class MainActivity extends Activity {

    private TextView textViewLog;

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

        textViewLog = findViewById(R.id.textViewLog);
    }

    private void updateTextView(final String text) {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                textViewLog.setText(textViewLog.getText() + "\n" + text);
            }
        });
    }

    private void someBackgroundTask() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                // Simulate some background work
                try {
                    Thread.sleep(2000); // Simulate some work
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                // Update the TextView with the result
                String hex = "Sample Hex Data";
                updateTextView("recv: " + hex);
            }
        }).start();
    }

    @Override
    protected void onStart() {
        super.onStart();
        someBackgroundTask();
    }
}

使用AsyncTask (已废弃)

AsyncTask 已被标记为废弃,不推荐使用,但在老版本中也可以用于更新UI。

其他方式

使用现代的Android架构组件,比如 ViewModelLiveData,可以更好地管理线程和UI更新。

总结

在现代Android开发中,推荐使用 HandlerrunOnUiThread() 来从子线程更新UI。确保所有UI更新操作都在主线程上执行,以避免崩溃或不稳定的行为。

精彩评论(0)

0 0 举报