Android Тост не отображается после открытия галереи и выбора изображения - PullRequest
0 голосов
/ 18 марта 2020

Я хочу показать Toast (или индикатор выполнения) при нажатии на кнопку «btnSearchImg». Если перед загрузкой изображения, кнопка нажала сказать «сначала выбрать изображение из галереи», а если после загрузки изображения нажала «ожидания». тост до загрузки изображения работает нормально, но после загрузки не работает нормально! весь мой код активности:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_search_by_image);
    Toasty.Config.getInstance().setTextSize(15).apply();

    mSharedPreferences = getSharedPreferences("PREFERENCE", Context.MODE_PRIVATE);
    mEditor = mSharedPreferences.edit();
    mEditor.putString(PREF_SKIP,null);
    if(mSharedPreferences.contains(PREF_SKIP)){
        Log.i("payment", "true");
    } else {
        try {

        }catch (Exception e){
            Toast.makeText(getApplicationContext(), "ERORR", Toast.LENGTH_LONG).show();
        }
    }

    context = getApplicationContext();
    pbImgRetrvialProccess = (ProgressBar)findViewById(R.id.pbImgRetrvialProccess);
    tvPermissionLoadImg = (TextView)findViewById(R.id.tvPermissionLoadImg);
    tvPermissionLoadImg.setTypeface(Base.getIranSansFont());
    TextView tvSearchImageToolBarText = (TextView) findViewById(R.id.tvSearchImageToolBarText);
    tvSearchImageToolBarText.setTypeface(Base.getIranSansFont());
    ivGalleryImgLoad = (ImageView) findViewById(R.id.ivGalleryImgLoad);
    btnSearchImgLoad = (Button) findViewById(R.id.btnSearchImgLoad);
    btnSearchImg = (Button) findViewById(R.id.btnSearchImg);
    btnSearchImgLoad.setOnClickListener(this);
    btnSearchImg.setOnClickListener(this);
}

public StringBuilder uniformQuantization( File filePath ){...}

private StringBuilder chHistogram( Mat newImage ){...}

private void CopyAssets(String filename){...}

private void copyFile(InputStream in, OutputStream out) throws IOException {...}

@Override
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.btnSearchImgLoad:
            if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
                ActivityCompat.requestPermissions(this,
                        new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, PICK_IMAGE);}
            OpenGallery();
            break;

        case R.id.btnSearchImg:
            Toasty.success(getBaseContext(), "Waiting...", Toast.LENGTH_LONG).show();
            FindSimilarRequestedImage();              
            break;
    }
}

private void OpenGallery() {
    Intent gallery = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
    startActivityForResult(gallery, PICK_IMAGE);
}


private void FindSimilarRequestedImage() {

    if (ivGalleryImgLoad.getDrawable() != null) {
        File loadedImageFilePath = new File(getRealPathFromURI(selectedImageUri));
        queryFeatureX = uniformQuantization(loadedImageFilePath);
        dateiLesenStringBuilder();
    } else {
        Toasty.error(getBaseContext(), "first pick image from gallary", Toast.LENGTH_LONG).show();
    }

}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (resultCode == RESULT_OK && requestCode == PICK_IMAGE && data != null) {
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {

            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, PICK_IMAGE);

        } else {
            selectedImageUri = data.getData();
            ivGalleryImgLoad.setImageURI(selectedImageUri);
            tvPermissionLoadImg.setVisibility(View.INVISIBLE);
        }
    }
}

private String getRealPathFromURI(Uri contentURI) {
    String result;
    Cursor cursor = getContentResolver().query(contentURI, null, null, null, null);
    if (cursor == null) { // Source is Dropbox or other similar local file path
        result = contentURI.getPath();
    } else {
        cursor.moveToFirst();
        int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA);
        result = cursor.getString(idx);
        cursor.close();
    }
    return result;
}

private void dateiLesenStringBuilder() {
    FEATURE_PATH = context.getCacheDir().getPath() + "/" + FEATURE_NAME;
    try {
        FileOutputStream out = new FileOutputStream(FEATURE_PATH);
        InputStream in = context.getAssets().open("coins/"+FEATURE_NAME);
        byte[] buffer = new byte[1024];
        int ch;
        while ((ch = in.read(buffer)) > 0){
            out.write(buffer, 0, ch);
        }
        out.flush();
        out.close();
        in.close();
    }catch (Exception e){
        System.out.println(e);
    }
    final File featureList = new File(FEATURE_PATH);
    Runnable runner = new Runnable() {
        BufferedReader in = null;
        @Override
        public void run() {
            try {
                String sCurrentLine;
                int lines = 0;
                BufferedReader newbw = new BufferedReader(new FileReader(featureList.getAbsolutePath()));
                while (newbw.readLine() != null)
                    lines++;
                in = new BufferedReader(new FileReader(featureList.getAbsolutePath()));
                ArrayList<Double> nDistVal = new ArrayList<Double>();
                ArrayList<String> nImagePath = new ArrayList<String>();
                int count = 0;
                while ((sCurrentLine = in.readLine()) != null) {
                    String[] featX = sCurrentLine.split(";")[1].split(" ");
                    nImagePath.add(sCurrentLine.split(";")[0]);
                    nDistVal.add(Distance.distL2(featX, queryFeatureX.toString().split(" ")));
                    count++;
                }
                ArrayList<Double> nstore = new ArrayList<Double>(nDistVal); // may need to be new ArrayList(nfit)
                double maxDistVal = Collections.max(nDistVal);
                Collections.sort(nDistVal);
                sortedNImagePath = new ArrayList<String>();
                for (int n = 0; n < nDistVal.size(); n++) {
                    int index = nstore.indexOf(nDistVal.get(n));
                    sortedNImagePath.add(nImagePath.get(index));
                    sortedNImageDistanceValues.add(String.valueOf(nDistVal.get(n) / maxDistVal));
                    String filePath = sortedNImagePath.get(0);
                    String minDistanceImg = sortedNImageDistanceValues.get(n);
                    FileNameFromPath = filePath.substring(filePath.lastIndexOf("/") + 1);
                    System.out.println("Distance values -> " + FileNameFromPath.toString());
                    System.out.println("Distance values -> " + minDistanceImg.toString());
                }
            } catch (Exception ex) {
                String x = ex.getMessage();
                System.out.println("ERORR" + x);
            }
            if (in != null) try {
                in.close();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                Intent imgSearchedCoinNameIntent = new Intent(SearchByImageActivity.this, ImageSearchedCoinActivity.class);
                imgSearchedCoinNameIntent.putExtra("imgSearchedCoinName", FileNameFromPath);
                startActivity(imgSearchedCoinNameIntent);
            }
        }
    };
    Thread t = new Thread(runner, "Code Executer");
    t.start();
  }
}

Если я поставлю тост "Ожидание ..." после FindSimilarRequestedImage(), появится тост, но мне нужно показать тост сразу после нажатия на btnSearchImg .

ПРИМЕЧАНИЕ: Также в dateiLesenStringBuilder() я удалил поток t, что эта часть кода работает в обычном потоке и в последовательном режиме, но ничего не меняется!

Ответы [ 2 ]

1 голос
/ 18 марта 2020

Вместо тоста используйте logcat, чтобы увидеть, запускаются они последовательно или нет, возможно, тосту требуется время для запуска

0 голосов
/ 18 марта 2020

Я решил эту проблему, поместив часть кода в задержку, как показано ниже:

private void FindSimilarRequestedImage() {
    if (ivGalleryImgLoad.getDrawable() != null) {
        pbImgRetrvialProccess.setVisibility(View.VISIBLE);
        Toasty.success(getBaseContext(), "Waiting ...", Toast.LENGTH_LONG).show();

        final Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                File loadedImageFilePath = new File(getRealPathFromURI(selectedImageUri));
                queryFeatureX = uniformQuantization(loadedImageFilePath);
                dateiLesenStringBuilder();
            }

        }, 5000);
    } else {
        Toasty.error(getBaseContext(), "first pick image from gallary", Toast.LENGTH_LONG).show();
    }
}

Теперь, прежде чем уничтожить функции броска активности, я сначала показываю тост, а затем запускаю другие функции!

...