我在
Android开发人员上跟进
image cashing tutorial using Volley,我遇到了请求图像请求并缓存它的问题,我想因为我创建的singelton(从教程中复制).
我的Eclipse在getInstance(this)中给出了错误,因为这是上下文而我正在请求一个图像.
ImageRequest request = new ImageRequest( url,new Response.Listener<Bitmap>() { @Override public void onResponse(Bitmap bitmap) { mNetworkImageView = (NetworkImageView) findViewById(R.id.ImageView); mImageLoader = MySingleton.getInstance(this).getImageLoader(); mNetworkImageView.setImageUrl(IMAGE_URL,mImageLoader); // mImageLoader = MySingleton.getInstance(this).getImageLoader(); // mImageLoader.get(IMAGE_URL,ImageLoader.getImageListener(mImageView,// R.drawable.ic_launcher,R.drawable.ic_launcher)); } },null,new Response.ErrorListener() { public void onErrorResponse(VolleyError error) { // mImageView.setImageResource(R.drawable.ic_launcher); } }); MySingleton.getInstance(this).addToRequestQueue(request);
这是单身人士:
package com.example.p; import com.android.volley.Request; import com.android.volley.RequestQueue; import com.android.volley.toolBox.ImageLoader; import com.android.volley.toolBox.Volley; import android.content.Context; import android.graphics.Bitmap; import android.support.v4.util.LruCache; public class MySingleton { private static MySingleton mInstance; private RequestQueue mRequestQueue; private ImageLoader mImageLoader; private static Context mCtx; private MySingleton(Context context) { mCtx = context; mRequestQueue = getRequestQueue(); mImageLoader = new ImageLoader( mRequestQueue,new ImageLoader.ImageCache() { private final LruCache<String,Bitmap> cache = new LruCache<String,Bitmap>(20); @Override public Bitmap getBitmap(String url) { return cache.get(url); } @Override public void putBitmap(String url,Bitmap bitmap) { cache.put(url,bitmap); } }); } public static synchronized MySingleton getInstance(Context context) { if (mInstance == null) { mInstance = new MySingleton(context); } return mInstance; } public RequestQueue getRequestQueue() { if (mRequestQueue == null) { // getApplicationContext() is key,it keeps you from leaking the // Activity or BroadcastReceiver if someone passes one in. mRequestQueue = Volley.newRequestQueue(mCtx.getApplicationContext()); } return mRequestQueue; } public <T> void addToRequestQueue(Request<T> req) { getRequestQueue().add(req); } public ImageLoader getImageLoader() { return mImageLoader; } }
我能够以这种方式获取图像并显示它,但我需要缓存它,所以我想将它添加到请求中吗? ..有什么帮助吗?
mNetworkImageView = (NetworkImageView) findViewById(R.id.ImageView); mImageLoader = MySingleton.getInstance(this).getImageLoader(); mNetworkImageView.setImageUrl(IMAGE_URL,mImageLoader);
解决方法
这是我的工作示例代码.希望这个帮助:
MainActivity.java:
import ... public class MainActivity extends Activity { final Context mContext = this; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); NetworkImageView mNetworkImageView = (NetworkImageView) findViewById(R.id.networkImageView); String mUrl = "http://192.168.0.100/api/getimage"; mNetworkImageView.setImageUrl(mUrl,VolleySingleton.getInstance(mContext).getImageLoader()); } ... }
VolleySingleton.java:
public class VolleySingleton { private static VolleySingleton mInstance; private RequestQueue mRequestQueue; private ImageLoader mImageLoader; private static Context mContext; private VolleySingleton(Context context) { mContext = context; mRequestQueue = getRequestQueue(); mImageLoader = new ImageLoader(mRequestQueue,new ImageLoader.ImageCache() { private final LruCache<String,Bitmap> cache = new LruCache<>(20); @Override public Bitmap getBitmap(String url) { return cache.get(url); } @Override public void putBitmap(String url,Bitmap bitmap) { cache.put(url,bitmap); } }); } public static synchronized VolleySingleton getInstance(Context context) { if (mInstance == null) { mInstance = new VolleySingleton(context); } return mInstance; } private RequestQueue getRequestQueue() { if (mRequestQueue == null) { // getApplicationContext() is key,it keeps you from leaking the // Activity or BroadcastReceiver if someone passes one in. mRequestQueue = Volley.newRequestQueue(mContext.getApplicationContext(),10 * 1024 * 1024); // this for caching } return mRequestQueue; } public <T> void addToRequestQueue(Request<T> req) { getRequestQueue().add(req); } public ImageLoader getImageLoader() { return mImageLoader; } }
activity_main.xml中:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical" tools:context=".MainActivity"> <com.android.volley.toolBox.NetworkImageView android:id="@+id/networkImageView" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout>
AndroidManifest.xml中:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.volleyapp" > <uses-permission android:name="android.permission.INTERNET" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>