2016-08-10 8 views
0

asysncタスクを使用して画像を表示するにはrecyclerViewを使用しています。私はWebサーバーからイメージを取得しています。私のコードは私のImageLoaderのasysncタスクがAndroid:リサイクラビューの画像リクエストをキャンセルするには

public class ImageLoadTask extends AsyncTask<Void, Void, Bitmap> { 

     private String url; 
     private ImageView imageView; 
     ProgressDialog pDialog; 

     public ImageLoadTask(String url, ImageView imageView) { 
      this.url = url; 
      this.imageView = imageView; 
     } 

     @Override 
     protected Bitmap doInBackground(Void... params) { 
      try { 
       URL urlConnection = new URL(url); 
       HttpURLConnection connection = (HttpURLConnection) urlConnection 
         .openConnection(); 
       connection.setDoInput(true); 
       connection.connect(); 

       InputStream input = connection.getInputStream(); 
       Bitmap myBitmap = BitmapFactory.decodeStream(input); 
       return myBitmap; 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Bitmap result) { 
      super.onPostExecute(result); 
      imageView.setImageBitmap(result); 
     } 
    } 

問題は、私がスクロールしたときであり、画像がダウンロードされる前に、一の以上のビューをスキップして、それである私が

new ImageLoadTask(url, holder.imageView).execute(); 

呼び出すMethodeのonBindViewHolderから

ですビューはリサイクルされます。実際のイメージがそのビューにロードされる前に、それらのイメージがフラッシュされる中間ビューでは、donwnload reqestは取り消されません。

アダプタからHttpURLConnectionを渡して試してみましたが、ヌルでないかどうかを確認してからdisconnectを前述のようにonBindViewHolderメソッドから呼び出しましたが、それでも起こります。私は使用しています

if (holder.urlConnection != null) 
    { 
     holder.urlConnection.disconnect(); 
     try { 
      holder.urlConnection.getInputStream().close(); 
     } 
     catch (Exception e) { 
      e.printStackTrace(); 
     } 
     holder.urlConnection = null; 
    } 

    new ImageLoadTask(url, holder.imageView,holder.viewHolderActivity, holder.urlConnection).execute(); 

イメージリクエストをキャンセルするにはどうすればよいですか?あなたのViewHolderあなたImageLoadTaskへの参照を保持オン

ImageLoadTask imageLoadTask=new ImageLoadTask(url, holder.imageView); 
imageLoadTask.cancel(true); 

答えて

0

は、画像要求を取り消すために、キャンセル()メソッドを使用してasynctaskをキャンセルするようにしてください。 onBindViewHolderの メソッドは、cancelメソッドを呼び出して既存のImageLoadTaskを取り消し、新しいイメージの新しいタスクを作成します。 AsyncTaskがキャンセルされると、onPostExecuteメソッドを呼び出さず、代わりにonCancelledを呼び出します。

0
ホルダーで

保存ImageLoadTaskリンク

if (holder.urlConnection != null) 
     { 
      holder.urlConnection.disconnect(); 
      try { 
       holder.urlConnection.getInputStream().close(); 
      } 
      catch (Exception e) { 
       e.printStackTrace(); 
      } 
      holder.urlConnection = null; 
     } 

     holder.imageTask = new ImageLoadTask(url, holder.imageView,holder.viewHolderActivity, holder.urlConnection); 
     holder.imageTask.execute(); 

//Called when a view created by this adapter has been recycled. 
public void onViewRecycled(VH holder){ 
     holder.imageTask.cancel(); 
} 
0

使用グライドでそれを取り消す: https://inthecheesefactory.com/blog/get-to-know-glide-recommended-by-google/en

これは、任意のバックからイメージをロードするための高速で応答性のフレームワークです終わり。あなたは、setTimeout、cancelRequests、fadeEffects、および他のもののようなものを行うことができます。あなたはネットワーク要求をどのように処理するか心配する必要はありません。グライドはあなたのためにそれを単に行います。

使用法:

Glide.with(context) 
    .load(imageLoadPath) 
    .placeholder(imgToShowWhileLoading) 
    .centerCrop() 
    .into(imageView); 

そしてあなたは、このようGlideModule構成を設定することができます (オリジナルコードスニペット:glide image loading timeout increase)。 GlideModuleを実装するカスタムクラスを作成します。一つでは、メソッドをオーバーライドしています:

@Override 
public void registerComponents(Context context, Glide glide) { 
    final int retryPolicy = 10000; 
    RequestQueue queue = new RequestQueue(
      new DiskBasedCache(new File(context.getCacheDir(), "volley")), 
      new BasicNetwork(new HurlStack())) { 
     @Override public <T> Request<T> add(Request<T> request) { 
      request.setRetryPolicy(new DefaultRetryPolicy(retryPolicy, 1, 1); 
      return super.add(request); 
     } 
    }; 
    queue.start(); 
    glide.register(GlideUrl.class, InputStream.class, new VolleyUrlLoader.Factory(queue)); 
} 

はタイムアウト制限をしたいすべてを再生し、そしてそれはあなたのニーズを満たすことができる方法を参照してください。

関連する問題