gpt4 book ai didi

Android UI 线程和消息处理程序混淆

转载 作者:太空狗 更新时间:2023-10-29 13:41:46 24 4
gpt4 key购买 nike

以下代码来自《Android Developer's Cookbook》一书的第58-61页。本书介绍了消息上下文中的代码,消息是一种在线程之间传递信息的方式。它这样描述代码:“计时器在后台线程中运行,因此它不会阻塞 UI 线程,但它需要在时间更改时更新 UI。”

我很困惑,因为我没有看到两个线程。在我看来,主 UI 线程似乎将可运行的消息发布到它自己的消息队列(然后该消息会延迟重新发布)。我错过了什么吗?

package com.cookbook.background_timer;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.SystemClock;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class BackgroundTimer extends Activity {
//keep track of button presses, a main thread task
private int buttonPress=0;
TextView mButtonLabel;

//counter of time since app started, a background task
private long mStartTime = 0L;
private TextView mTimeLabel;

//Handler to handle the message to the timer task
private Handler mHandler = new Handler();

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

if (mStartTime == 0L) {
mStartTime = SystemClock.uptimeMillis();
mHandler.removeCallbacks(mUpdateTimeTask);
mHandler.postDelayed(mUpdateTimeTask, 100);
}

mTimeLabel = (TextView) findViewById(R.id.text);
mButtonLabel = (TextView) findViewById(R.id.trigger);

Button startButton = (Button) findViewById(R.id.trigger);
startButton.setOnClickListener(new View.OnClickListener() {
public void onClick(View view){
mButtonLabel.setText("Pressed " + ++buttonPress + " times");
}
});
}

private Runnable mUpdateTimeTask = new Runnable() {
public void run() {
final long start = mStartTime;
long millis = SystemClock.uptimeMillis() - start;
int seconds = (int) (millis / 1000);
int minutes = seconds / 60;
seconds = seconds % 60;

mTimeLabel.setText("" + minutes + ":" + String.format("%02d",seconds));
mHandler.postDelayed(this, 200);
}
};

@Override
protected void onPause() {
mHandler.removeCallbacks(mUpdateTimeTask);
super.onPause();
}

@Override
protected void onResume() {
super.onResume();
mHandler.postDelayed(mUpdateTimeTask, 100);
}
}

最佳答案

第二个线程有点隐藏。它是在 onCreate() 中调用 postDelayed(mUpdateTImeTask,100) 的时候。处理程序中有一个线程对延迟时间(在本例中为 100 毫秒)进行倒计时,然后运行 ​​mUpdateTImeTask。请注意,在 mUpdateTimeTask 的 run() 方法结束时,它通过再次调用 postDelayed() 将自己放回到处理程序的计时器线程中。

Android api 有很多类,例如 Handler 和 AsyncTask,可以更轻松地进行多线程处理。这些类隐藏了许多线程的具体细节(这正是它们易于使用的原因)。不幸的是,这使得了解正在发生的事情变得很困难——你必须知道正在发生什么才能了解​​它。 :)

关于Android UI 线程和消息处理程序混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4894230/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com