У меня следующая проблема:
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);
}
}
}