Получение результата потока в другом действии для Android - PullRequest
0 голосов
/ 16 декабря 2018

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.Я проследил их, используя регистратор.Когда я пропускаю многопоточность и указываю путь к изображению для активности, все идет хорошо, если не слишком медленно переключать активность.

Пожалуйста, укажите проблему или предложите лучшее решение.

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

Оказалось, что проблема была в передаче ResultImageProcessor объекта в ResultActivity намерение как Parcelable .Я следовал простому пути объявления resultActivityContext как статического в ResultImageProcessor.

public class ResultImageProcessor implements Runnable {
    public static ResultActivity resultActivityContext;
    ...
    @Override
    public void run() {
        ...
        resultActivityContext.onImageSaved(picPath);
        resultActivityContext = null;
    }
}

и в ResultActivity:

ResultImageProcessor.resultActivityContext = this;
0 голосов
/ 16 декабря 2018

я думаю, что вам не хватает прогона в вашем рабочем столе, как это

new Runnable() {
            @Override
            public void run() {
                String picPath = ProcessImage(Obj..Attributes);
                //wait until result activity context is not set
                while(resultActivityContext == null){}
                resultActivityContext.onImageSaved(picPath);
            }
        }.run();
...