public static Handler handler=new Handler(){//创建消息处理器对象 //在主线程中处理从子线程发送过来的消息 @Override public void handleMessage(Message msg){ //创建一个Bundle 用来接收MusicService中传递过来的消息 Bundle bundle=msg.getData();//获取从子线程发送过来的音乐播放进度 int duration=bundle.getInt("duration"); int currentPosition=bundle.getInt("currentPosition"); sb.setMax(duration); sb.setProgress(currentPosition); //歌曲总时长 int minute=duration/1000/60; int second=duration/1000%60; String strMinute=null; String strSecond=null; if(minute<10){//如果歌曲的时间中的分钟小于10 strMinute="0"+minute;//在分钟的前面加一个0 }else{ strMinute=minute+""; } if (second<10){//如果歌曲中的秒钟小于10 strSecond="0"+second;//在秒钟前面加一个0 }else{ strSecond=second+""; } tv_total.setText(strMinute+":"+strSecond); //歌曲当前播放时长 minute=currentPosition/1000/60; second=currentPosition/1000%60; if(minute<10){//如果歌曲的时间中的分钟小于10 strMinute="0"+minute;//在分钟的前面加一个0 }else{ strMinute=minute+" "; } if (second<10){//如果歌曲中的秒钟小于10 strSecond="0"+second;//在秒钟前面加一个0 }else{ strSecond=second+" "; } tv_progress.setText(strMinute+":"+strSecond); } };代码解释
时间: 2024-03-04 10:51:03 浏览: 11
这段代码是一个Android应用中的消息处理器,用来处理从子线程发送过来的消息。当子线程发送音乐播放进度的消息时,该处理器会将音乐播放进度显示在进度条和文本视图中。具体来说,它会从消息中获取音乐的总时长和当前播放时长,并根据这些值来设置进度条的最大值和当前进度。同时,它还会将音乐的总时长和当前播放时长格式化成分钟和秒钟,并将它们显示在文本视图中。注意,这段代码中的控件对象(如sb、tv_total和tv_progress)应该是在其他地方定义并初始化过的。
相关问题
Handler子线程和主线程不在一个类文件中要怎么传值,例子
可以使用Handler的sendMessage()和 handleMessage()方法在子线程和主线程之间传递消息和数据。以下是一个简单的例子:
在主线程中创建一个Handler对象,并在它的handleMessage()方法中处理子线程发来的消息:
```java
public class MainActivity extends AppCompatActivity {
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
// 处理子线程传来的消息
int data = msg.arg1;
Log.d(TAG, "Received data from sub thread: " + data);
}
};
// 在主线程中启动子线程,将Handler对象传递给子线程
public void startSubThread() {
SubThread subThread = new SubThread(mHandler);
subThread.start();
}
}
```
在子线程中通过Handler的sendMessage()方法向主线程发送消息:
```java
public class SubThread extends Thread {
private Handler mHandler;
public SubThread(Handler handler) {
mHandler = handler;
}
@Override
public void run() {
// 在子线程中处理耗时操作
int data = 123;
// 向主线程发送消息和数据
Message msg = mHandler.obtainMessage();
msg.arg1 = data;
mHandler.sendMessage(msg);
}
}
```
这样在子线程和主线程之间就可以传递数据和消息了。注意,在子线程中不能直接更新UI,否则会抛出异常,必须在主线程中更新UI。
Android中 使用AHandler和ALooper构建一个子线程的消息循环并处理消息吗,给出c++代码
可以使用AHandler和ALooper来构建一个子线程的消息循环并处理消息,以下是一个简单的C++示例代码:
```c++
#include <utils/Looper.h>
#include <utils/Thread.h>
class MyThread : public Thread {
public:
MyThread() {}
virtual void onLooperPrepared() {
handler_ = new MyHandler();
looper_ = Looper::prepare();
looper_->addFd(fd_, 0, ALOOPER_EVENT_INPUT, MyThread::callback, this);
looper_->start();
}
static int callback(int fd, int events, void* data) {
MyThread* thread = static_cast<MyThread*>(data);
// 读取子线程中的消息
thread->looper_->pollOnce(0);
return 1;
}
private:
int fd_;
sp<ALooper> looper_;
sp<MyHandler> handler_;
};
class MyHandler : public AHandler {
public:
MyHandler() {}
virtual void onMessageReceived(const sp<AMessage>& msg) {
// 处理消息
}
};
int main(int argc, char** argv) {
MyThread thread;
thread.run("MyThread");
sp<MyHandler> handler = thread.handler_;
// 发送消息到子线程
sp<AMessage> msg = new AMessage();
handler->sendMessage(msg);
return 0;
}
```
在这个示例代码中,我们首先创建了一个MyThread继承自Thread,并在onLooperPrepared中创建了一个MyHandler和ALooper。然后我们将一个文件描述符fd与ALooper关联,以便在子线程中接收主线程的消息。
在主线程中,我们通过thread.handler_获取了MyThread中的MyHandler,并将消息发送到子线程中。在子线程中,我们在callback中通过looper_->pollOnce来读取子线程中的消息,并在MyHandler中处理这些消息。