как initloader после обнаружения штрих-кода? - PullRequest
0 голосов
/ 12 мая 2018

У меня следующая проблема:

java.lang.IllegalStateException: initLoader должен вызываться в главном потоке

На realizarConsulta метод именно тогда, когда я вызываю initLoader.

Дело в том, что после считывания штрих-кода я хочу сделать запрос к базе данных знать, если штрих-код уже есть в нем или нет. Но когда я попробовал в этом коде, который выдает IllegalStateException, я подумал, что перемещение операции в метод-член класса EscaneoActivity решит проблему, но это не так.

public class EscaneoActivity extends AppCompatActivity implements IPostLoaderConsulta {

SurfaceView camara;

private static Barcode codigoActual;


@Override
protected void onCreate(Bundle savedInstanceState) {
    setTitle("Escaner");
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_scaneo);
    camara = (SurfaceView) findViewById(R.id.sv_escaneo_camara);
    configurarCamara();
}

public void realizarConsulta(Bundle b){
    getSupportLoaderManager().initLoader(MainActivity.LOADER_CONSULTOR_PRODUCTOS_DB, //Lanza java.lang.IllegalStateException: initLoader must be called on the main thread
            b,
            AdminSingletons.darInstanciaConsultorProductos(this, EscaneoActivity.this));
}

public void configurarCamara() {
    BarcodeDetector detector = new BarcodeDetector.Builder(this).build();
    final CameraSource cameraSource = new CameraSource.Builder(this, detector)
            .setAutoFocusEnabled(true)
            .setRequestedPreviewSize(1600, 1024)
            .build();

    camara.getHolder().addCallback(new SurfaceHolder.Callback() {
        @Override
        public void surfaceCreated(SurfaceHolder surfaceHolder) {
            if (ActivityCompat.checkSelfPermission(EscaneoActivity.this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
                // TODO: Consider calling
                //    ActivityCompat#requestPermissions
                // here to request the missing permissions, and then overriding
                //   public void onRequestPermissionsResult(int requestCode, String[] permissions,
                //                                          int[] grantResults)
                // to handle the case where the user grants the permission. See the documentation
                // for ActivityCompat#requestPermissions for more details.
                //TODO: Si no tiene los permisos, entonces se deberían solicitar via ActivityCompat.requestPermissions - https://developer.android.com/training/permissions/requesting.html?hl=es-419#perm-request
                return;
            }

            try {
                cameraSource.start(camara.getHolder());
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {

        }

        @Override
        public void surfaceDestroyed(SurfaceHolder surfaceHolder) {
            cameraSource.stop();
        }
    });
    detector.setProcessor(new Procesador(this));
}


public class Procesador implements Detector.Processor<Barcode> {

    EscaneoActivity escaneoActivity;

    public Procesador(EscaneoActivity e){
        this.escaneoActivity = e;
    }

    @Override
    public void release() {

    }

    @Override
    public void receiveDetections(Detector.Detections<Barcode> detections) {
        SparseArray<Barcode> objetosDetectados = detections.getDetectedItems();
        if(objetosDetectados.size() > 0) {
            Barcode barcode = objetosDetectados.valueAt(0);
            EscaneoActivity.codigoActual = barcode;
            Bundle b = new Bundle();
            b.putLong(ConsultorProductosBD.X, Long.parseLong(barcode.displayValue));
            escaneoActivity.realizarConsulta(b);
        }
    }

}

1 Ответ

0 голосов
/ 12 мая 2018

Если вы хотите запустить что-то в потоке пользовательского интерфейса, вы можете использовать это:

new Handler(Looper.getMainLooper()).post(new Runnable() {
    @Override
    public void run() {
        // your initloader command
    }
});

Но если вы используете Loader, он должен запрашивать автоматически при обнаружении изменений. Таким образом, вы делаете initLoader один раз, а затем он делает всю работу за вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...