android - 我可以从 UI 线程以外的不同线程访问 android 小部件引用吗?

标签 android

在 Android 中,我认为我无法从 UI 线程以外的其他线程访问 ui 对象。这就是为什么处理程序和所有在那里将细节传回 ui 线程的原因。

我尝试了下面的简单示例。我试图从创建的新线程更新进度条。有效。我以为我会异常(exception)。你能解释一下为什么我没有得到异常吗。

public class Main3Activity extends AppCompatActivity {

    private static final String TAG = "Main3Activity";

    Thread thread;
    private ProgressBar progressBar;

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

        thread = new Thread(new MyThread());

        progressBar  = (ProgressBar) findViewById(R.id.progressBar);
        Log.i(TAG, "run: "+Thread.currentThread().getName());

        thread.start();

    }

    class MyThread implements Runnable{

        @Override
        public void run() {
            Log.i(TAG, "run: "+Thread.currentThread().getName());
            for(int i=0; i<100; i++){
                progressBar.setProgress(i);
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

最佳答案

ProgressBar 在更新进度之前内部检查它是否在 UI 线程中。

如果进度是从非 ui-thread 更新的,那么它将创建自己的 runnable,它在 UI-Thread 上运行。

if (mUiThreadId == Thread.currentThread().getId()) {
// update progress bar
} else {
// create ui thread before updating progress bar
}

请参阅link获取代码详情。

关于android - 我可以从 UI 线程以外的不同线程访问 android 小部件引用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42009521/

相关文章:

android - 如何在android ..中使用淡入淡出到背景图像?

Android:如何在代码中使用 dip(与密度无关的像素)?

java - Android firebase - 显示特定数据

Android OpenGL ES 2.0——glReadPixels() 和 glTexImage2D() 绘制黑色纹理?

android - Android 上的 ORMLite 不调用 onCreate

android - 无法解析: org. mozilla.geckoview

java - 抽屉导航监听器不在 fragment 中工作

android - Android 应用程序的标记架构

android - 使用自定义监听器扩充类时出错

java - 我如何使用引用的库