-1

Можно ли использовать HandlerThread внутри OnReceive методом BroadcastReceiver «ы, который дополнительно запускает услугу на основной UI нить ??HandlerThread внутри BroadcastReceiver

Моя цель состоит в том, чтобы использовать HandlerThread внутри OnReceive метода, так что служба запускается в отдельном потоке.

Но не знаю, как его реализовать.

Любые подсказки?

Благодаря

EDIT: Класс обслуживания

public class BackgroundVideoRecorder extends Service implements SurfaceHolder.Callback { 

public WindowManager windowManager; 
public SurfaceView surfaceView; 
public Camera camera = null; 
public MediaRecorder mediaRecorder = null; 


@Override 
public IBinder onBind(Intent intent) { 
    return null; 
} 



@Override 
public void onCreate() { 

    // Create new SurfaceView, set its size to 1x1, move it to the top left corner and set this service as a callback 
    windowManager = (WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE); 
    surfaceView = new SurfaceView(getApplicationContext()); 
    WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams(
      1, 1, 
      WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY, 
      WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH, 
      PixelFormat.TRANSLUCENT 
    ); 
    layoutParams.gravity = Gravity.LEFT | Gravity.TOP; 
    windowManager.addView(surfaceView, layoutParams); 
    surfaceView.getHolder().addCallback(this); 

} 

// Method called right after Surface created (initializing and starting MediaRecorder) 
@Override 
public void surfaceCreated(SurfaceHolder surfaceHolder) { 

    try { 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { 
      if (ContextCompat.checkSelfPermission(getApplicationContext(), CAMERA) == PackageManager.PERMISSION_GRANTED) { 
       camera = Camera.open(); 
      }else{ 
       // should show permission 
      } 

     } else { 
      camera = Camera.open(); 
     } 
     mediaRecorder = new MediaRecorder(); 
     camera.unlock(); 

     mediaRecorder.setPreviewDisplay(surfaceHolder.getSurface()); 
     mediaRecorder.setCamera(camera); 
     mediaRecorder.setAudioSource(MediaRecorder.AudioSource.CAMCORDER); 
     mediaRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); 
     mediaRecorder.setProfile(CamcorderProfile.get(CamcorderProfile.QUALITY_1080P)); 


     mediaRecorder.setOutputFile(
       Environment.getExternalStorageDirectory() + "/" + 
         DateFormat.format("yyyy-MM-dd_kk-mm-ss", new Date().getTime()) + 
         ".mp4" 
     ); 

     try { 
      mediaRecorder.prepare(); 
     } catch (Exception e) { 
     } 
     mediaRecorder.start(); 

    } catch (Exception e) { 

    } 


} 

// Stop recording and remove SurfaceView 
@Override 
public void onDestroy() { 

    mediaRecorder.stop(); 
    mediaRecorder.reset(); 
    mediaRecorder.release(); 

    camera.lock(); 
    camera.release(); 

    windowManager.removeView(surfaceView); 

} 


@Override 
public void surfaceChanged(SurfaceHolder surfaceHolder, int format, int width, int height) { 
} 

@Override 
public void surfaceDestroyed(SurfaceHolder surfaceHolder) { 
} 


} 

Я думаю, что я правильно не используя услуги. Пожалуйста помоги.

EDIT2: Logcat

08/11 18:00:20: Launching app 
$ adb push  F:\AndroidStudioWorkspace\MyApplication2\app\build\outputs\apk\app-debug.apk /data/local/tmp/com.example.jatin.myapplication2 
$ adb shell pm install -r "/data/local/tmp/com.example.jatin.myapplication2" 
    pkg: /data/local/tmp/com.example.jatin.myapplication2 
Success 


$ adb shell am start -n  "com.example.jatin.myapplication2/com.example.jatin.AgentSpy.MainActivity" -a android.intent.action.MAIN -c android.intent.category.LAUNCHER 
Client not ready yet..Waiting for process to come online 
Connected to process 7445 on device xiaomi-mi_4i-a67ae459 
D/###BVRREC###: true 
I/MediaRecorderJNI: prepare: surface=0x5583ad0d30 
I/Choreographer: Skipped 64 frames! The application may be doing too much  work on its main thread. 
D/###BVRREC###: false 
V/RenderScript: Application requested CPU execution 
V/RenderScript: 0x558342fa80 Launching thread(s), CPUs 8 
D/###BVRREC###: true 
I/MediaRecorderJNI: prepare: surface=0x5583b23330 
I/Choreographer: Skipped 42 frames! The application may be doing too much  work    on its main thread. 
    D/###BVRREC###: false 
    Application terminated. 
+0

Почему вы хотите вызвать 'startService()' в отдельном потоке? Объясните пожалуйста. –

+0

Поскольку каждый раз, когда я запускаю приложение, в моем лог-коте есть сообщение. «Слишком много wokring в основном потоке», и мое устройство замедляется. –

+0

Вы не будете исправлять это, вызвав 'startService()' в другом потоке. Ваша проблема в другом месте. Отправьте код своего метода 'onStart()' или 'onStartCommand()'. –

ответ

0

Обратитесь к BroadcastReceiver, вы можете НЕ использование HandlerThread в onReceive метода:

Receiver Lifecycle

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

Process Lifecycle

...... Это означает, что для длительных выполняющихся операций вы будете часто использовать службу в сочетании с BroadcastReceiver держать процесс, содержащий активный в течение всего времени вашей операции.

SO СЛЕДУЕТ ANDROID API ПУТЕВОДИТЕЛИ: Для того, чтобы запустить дольше выполняющихся операцию при onReceive вызове, вы должны запустить службу, а затем создать еще один поток в обслуживании.

Обратитесь к Extending the Service class за образцом кода, который создает HandlerThread и просто спите в течение 5 секунд после получения сообщения.

+0

. Тогда любое предложение о том, как выполнять длительную работу внутри получателя, кроме службы, поскольку я использую службу, все еще не получает желаемых результатов. –

+0

Если выполняется длительная работа - это ваша цель, почему сервис не может удовлетворить ваши пожелания? Как вы его реализуете? – li2

+0

Exatly.There вы. Я ищу решение этой проблемы, почему она показывает: «Приложение может выполнять слишком много работы над основным потоком», хотя мое приложение работает нормально, но мое устройство замедляется –