Кэширование изображений Picasso с использованием Bitmap

#java #android #caching #picasso #image-caching

#java #Android #кэширование #picasso #кэширование изображений

Вопрос:

Это содержимое этого метода LoadImage никогда не вызывается, хотя я вызываю этот метод в onActivityResult.

 public void loadImage(Uri uri){
    File file = new File(getApplicationContext().getExternalCacheDir().getAbsolutePath()   "/"  uid   ".jpg");
    Log.d("Check Bitmap", "file"   file);
    try {
        Picasso picasso = Picasso.get();
        Bitmap bitmap = picasso.load(uri).get();
        Log.d("Check Bitmap", "bitmap working");
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100,new FileOutputStream(file));
    } catch (Exception e) {
        Log.d("Check Bitmap", "bitmap not working, cached");
        e.printStackTrace();
    }
  

Моя цель — извлечь изображение из файла.

Это мой результат onActivityResult

  @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(requestCode ==1000){
            {
                if(resultCode == Activity.RESULT_OK){
                    imageUri = data.getData();
                    Context context;
                    final ProgressDialog dialog = new ProgressDialog(myProfile.this);
                    dialog.setMessage("Uploading Image...");
                    dialog.show();
                    profilepic.setImageURI(imageUri);

                    ref.putFile(imageUri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                                @Override
                                public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                                    ref.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                                        @Override
                                        public void onSuccess(Uri uri) {
                                            final Picasso picasso = Picasso.get();
                                            picasso.setIndicatorsEnabled(true);
                                            picasso.load(uri).into(profilepic);
                                            downloadUri = uri;
                                            dialog.dismiss();
                                            Toast.makeText(getApplicationContext(), "Image Uploaded!", Toast.LENGTH_SHORT).show();


                                            loadImage(uri); //Here I call
                   
  

Комментарии:

1. какие журналы вы видите? можете ли вы опубликовать также свои onCreate методы? (куда вы звоните loadImage )

2. На самом деле я вызываю метод в onActivityResult , я ранее писал onCreate для простоты. Хотя я надеюсь, что это ни на что не повлияет, так как тост работает нормально, и все остальные строки также выполняются нормально.

3. И мои журналы отображаются не так, как ожидалось по строке в методе LoadImage .

Ответ №1:

Вы не должны использовать разделенный пробелом ТЕГ для журналов. Попробуйте заменить ваше "Check Bitmap" на что-то из одного слова (например. «Checkere»). Затем вы сможете просмотреть свой журнал в своем Logcat. Вам нужно поместить все в поток.

Вот полный блок кода для LoadImage

  public void loadImage(final Uri uri){
        Thread thread = new Thread() {
            @Override
            public void run() {
                Log.d("Checkere", "stuck at file");
                File file = new File(getCacheDir()   File.separator   uid   ".jpg");
                Log.d("Checkere", "file"   file);
                try {
                    Picasso picasso = Picasso.get();
                    Bitmap bitmap = picasso.load(uri).get();
                    Log.d("Checkere", "bitmap working");
                    FileOutputStream fOut = new FileOutputStream(file);
                    bitmap.compress(Bitmap.CompressFormat.PNG, 85, fOut);
                    fOut.flush();
                    fOut.close();
                } catch (Exception e) {
                    Log.d("Checkere", e.getMessage());
                    e.printStackTrace();
                }
            }};
        thread.start();
    }

  

Обратите внимание, что я также добавил эти две строки в ваш код.

 fOut.flush(); 
fOut.close();
  

Я надеюсь, что это поможет!