我正在尝试在屏幕上显示进度条的屏幕(比如活动A),我需要在进度条运行时向其他活动(活动B)broadcastReceiver发送广播。如果活动B中的功能完成,它将显示回该活动A。
现在我在这样的工作线程中运行进度条并使用handler(Looper.getMainLooper())发送localbroadcast:
final Context context = Activity.this.getApplicationContext();
new Thread(new Runnable() {
@Override
public void run() {
while (progressBar.getProgress() != 100) {
try {
progressBar.incrementProgressBy(2);
Thread.currentThread().sleep(100);
} catch (InterruptedException ie) {
Log.e(LOG_TAG, "Interrupted exception in progress bar: " + ie);
}
if (progressBar.getProgress() == 10) {
Handler handler = new Handler(Looper.getMainLooper());
handler.post(new Runnable() {
@Override
public void run() {
// model is a parameter which I want to send using intents
Intent intent = new Intent("new_device");
intent.putExtra("device", model);
LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
}
});
}
}
}
}).start();
但它不起作用。其他活动未收到广播。 我知道广播应该在UI线程上完成,如果我在onResume()或onCreate()方法中执行它,它可以正常工作。但是当我在一个线程内部的一个处理程序中使用它时(在onCreate()内部),它无效。
我做错了什么或者还有其他办法吗?
我接受我在活动B中的意图如下:
private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Model model = (Model) intent.getSerializableExtra("device");
onConnectDevice(model.getDevice());
}
};
答案 0 :(得分:0)
尝试使用线程内活动的runonuithread方法
答案 1 :(得分:0)
我相信您的问题在progressBar.incrementProgress()
,因为您正在尝试从UI线程外部更改UI元素。保持你的结构,你可以尝试类似的东西:
final Handler handler = new Handler(Looper.getMainLooper());
final Thread thread = new Thread(new Runnable() {
@Override
public void run() {
while (progressBar.getProgress() != 100) {
try {
handler.post(new Runnable() {
@Override
public void run() {
progressBar.incrementProgressBy(2);
}
});
Thread.sleep(100);
} catch (InterruptedException ie) {
}
if (progressBar.getProgress() == 10) {
handler.post(new Runnable() {
@Override
public void run() {
Intent intent = new Intent("new_device");
intent.putExtra("device", model);
Context context = progressBar.getContext();
LocalBroadcastManager.getInstance(context).sendBroadcast(intent);
}
});
}
}
}
});
thread.start();
还要确保达到10
(例如,序列可能为1-3-5-7-9-11
,您将无法获得任何内容。
我还从进度条中获取了上下文,您不需要先获取它。
有比这更好的解决方案,但我保留了你的结构。