2015-01-28 3 views
3

У меня есть класс, который работает на основной теме процесса. Я хочу реализовать широковещательный приемник в этом классе, который работает в отдельном потоке.Запуск широковещательного приемника по отдельной теме

Я попытался это, сделав внутренний класс, расширяющего нить & intializing обработчик в этом внутреннем классе, который я могу дать registerReceiver (BroadcastReceiver приемник, IntentFilter фильтр, струнный broadcastPermission, Обработчик планировщик) для выполнения широковещательного приемника на этом обработчик (который прикреплен к вновь созданному потоку). но тщетно. Журналы показывают, что onReceive вызывается в основном потоке.

Пожалуйста, помогите. (Я видел несколько сообщений о том, как использовать registerReceiver (приемник BroadcastReceiver, фильтр IntentFilter, String broadcastPermission, планировщик обработчиков), но не какой-либо помощи).

+2

OnReceive всегда вызывает в основном потоке. Это поведение описывается системой Android. Вы можете запустить новый поток внутри вашего ресивера и выполнить всю работу внутри этой темы. –

+0

Почему вы хотите, чтобы ваш широковещательный приемник работал в отдельной теме? Я имею в виду, что цель? –

ответ

3

Я хотел бы предложить вам следует использовать HandlerThread вместо подклассов в Thread

, например

HandlerThread handlerThread = new HandlerThread("DifferentThread" , android.os.Process.THREAD_PRIORITY_BACKGROUND); 
handlerThread.start(); 
Looper looper = handlerThread.getLooper(); 
private Handler handler = new Handler(looper, this); 
// Register the broadcast receiver to run on the separate Thread 
registerReceiver (myReceiver, intentFilter, broadcastPermission, handler); 

Надежда это поможет в вашем эксперименте;)

Njoy!

+0

Спасибо Shubhang за помощью. Что касается вашего вышеупомянутого вопроса, мне нужен широковещательный приемник в отдельном потоке, потому что он должен сделать некоторое уведомление о получении некоторых намерений, в то время как класс, в котором он реализуется, является видом класса utility/helper. поэтому запуск BR на отдельном потоке обеспечивает блокировку вызывающего абонента классу dnt. надеюсь, что я делаю правильное проектирование. – Learner

+0

@Learner Прошло некоторое время с тех пор, как это было опубликовано, но этот подход сработал для вас? Я просматриваю одну и ту же архитектуру BR и хотел бы получить некоторые отзывы о вашем опыте. – Storo

1

При использовании HandlerThread обязательно отключите поток после отмены регистрации BroadcastReceiver. Если нет, утечки файлового дескриптора (FD) происходят на уровне Linux, и, наконец, приложение будет разбито, если продолжить регистрацию/отмену регистрации.

unregisterReceiver (...);

Тогда
looper.quit();
или
looper.quitSafely();

private Handler broadcastReceiverHandler = null; 
private HandlerThread broadcastReceiverThread = null; 
private Looper broadcastReceiverThreadLooper = null; 

private BroadcastReceiver broadcastReceiverReadScans = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 

    } 
} 

private void registerForIntents() { 
    broadcastReceiverThread = new HandlerThread("THREAD_NAME");//Create a thread for BroadcastReceiver 
    broadcastReceiverThread.start(); 

    broadcastReceiverThreadLooper = broadcastReceiverThread.getLooper(); 
    broadcastReceiverHandler = new Handler(broadcastReceiverThreadLooper); 

    IntentFilter filterScanReads = new IntentFilter(); 
    filterScanReads.addAction("ACTION_SCAN_READ"); 
    filterScanReads.addCategory("CATEGORY_SCAN"); 

    context.registerReceiver(broadcastReceiverReadScans, filterScanReads, null, broadcastReceiverHandler); 
} 

private void unregisterIntents() { 
    context.unregisterReceiver(broadcastReceiverReadScans); 
    broadcastReceiverThreadLooper.quit();//Don't forget 
}