My Main Activity вызывает ResultActivity
и одновременно вызывает поток Runnable
.Я хочу, чтобы операция Result не ожидала какой-то части обработки результата (Image), которая может быть предоставлена потоком позже, а пользовательский интерфейс может быть соответствующим образом обновлен.
То, что я пытался сделать, приведено ниже.
MainActivity (метод ниже * на самом деле callback
от другого thread
):
@Override
public void onCreate(Context context) {
resultImageProcessor = new ResultImageProcessor();
resImgProThread = new Thread(resultImageProcessor);
}
@Override
public void onBarcodeDetected(final Barcode barcode) {
resultImageProcessor.setCameraBarcode(mCameraSource,barcode);
resImgProThread.start();
Intent intent = new Intent(this, ResultActivity.class);
intent.putExtra(BarcodeObject, barcode);
intent.putExtra(ResultCode, CommonStatusCodes.SUCCESS);
intent.putExtra(ResImgProcObject, resultImageProcessor);
startActivity(intent);
}
Обработчик изображения результата:
public class ResultImageProcessor implements Serializable, Runnable {
private ResultActivity resultActivityContext;
ResultImageProcessor(){
this.resultActivityContext = null;
}
public void setResultActivity(ResultActivity resultActivity) {
this.resultActivityContext = resultActivity;
}
public void setCameraBarcode(CameraSource cameraSource, Barcode barCode){
mCameraSource = cameraSource;
barcode = barCode;
}
@Override
public void run() {
String picPath = ProcessImage(Obj..Attributes);
//wait until result activity context is not set
while(resultActivityContext == null){
try {
sleep(50);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
resultActivityContext.onImageSaved(picPath);
}
}
Операция результата:
protected void onCreate(Bundle savedInstanceState) {
//...
data = getIntent();
Barcode barcode = data.getParcelableExtra(MainActivity.BarcodeObject);
ResultImageProcessor resultImageProcessor = data.getParcelableExtra(MainActivity.ResImgProcObject);
resultImageProcessor.setResultActivity(this);
}
//called from Result image processor
public void onImageSaved(String imagePath){
ImageView barImgView = findViewById(R.id.barcode_image);
Bitmap barcodeImage = BitmapFactory.decodeFile(imagePath);
barImgView.setImageBitmap(barcodeImage);
barImgView.invalidate();
}
С помощью приведенного выше кода после вызова resultImageProcessor.startProcessing()
результат действия не запускается, а метод run()
runnable остается занятым в цикле while.Я проследил их, используя регистратор.Когда я пропускаю многопоточность и указываю путь к изображению для активности, все идет хорошо, если не слишком медленно переключать активность.
Пожалуйста, укажите проблему или предложите лучшее решение.