尽管使用了Looper.getMainLooper(),LocalBroadcast仍无法在工作线程内工作

时间:2016-01-26 16:53:33

标签: android handler android-broadcast android-handler localbroadcastmanager

我正在尝试在屏幕上显示进度条的屏幕(比如活动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());
        }
    };

2 个答案:

答案 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,您将无法获得任何内容。

我还从进度条中获取了上下文,您不需要先获取它。

有比这更好的解决方案,但我保留了你的结构。