在安卓的getInstance排球错误(这一点)加时ImageLoader的 [英] Android Volley error in getInstance(this) when adding ImageLoader
问题描述
我跟进图像兑现使用凌空的在Android开发者教程中,我我有问题,要求图像的要求和缓存的话,我想是因为我创造了singelton(从本教程复制)的。
我的Eclipse是给在的getInstance(本)
,因为这是上下文错误,我要求的图像,我猜。
ImageRequest请求=新ImageRequest(
URL,
新Response.Listener<位图>(){
@覆盖
公共无效onResponse(位图位图){
mNetworkImageView =(NetworkImageView)findViewById(R.id.ImageView);
mImageLoader = MySingleton.getInstance(本).getImageLoader();
mNetworkImageView.setImageUrl(IMAGE_URL,mImageLoader);
// mImageLoader = MySingleton.getInstance(本).getImageLoader();
// mImageLoader.get(IMAGE_URL,ImageLoader.getImageListener(mImageView,
// R.drawable.ic_launcher,R.drawable.ic_launcher));
}
},
0,
0,
空值,
新Response.ErrorListener(){
公共无效onErrorResponse(VolleyError错误){
// mImageView.setImageResource(R.drawable.ic_launcher);
}
});
MySingleton.getInstance(本).addToRequestQueue(要求);
这是单:
包com.example.p;
进口com.android.volley.Request;
进口com.android.volley.RequestQueue;
进口com.android.volley.toolbox.ImageLoader;
进口com.android.volley.toolbox.Volley;
进口android.content.Context;
进口android.graphics.Bitmap;
进口android.support.v4.util.LruCache;
公共类MySingleton {
私有静态MySingleton mInstance;
私人请求队列mRequestQueue;
私人ImageLoader的mImageLoader;
私有静态语境mCtx;
私人MySingleton(上下文的背景下){
mCtx =背景;
mRequestQueue = getRequestQueue();
mImageLoader =新ImageLoader的(
mRequestQueue,
新ImageLoader.ImageCache(){
私人最终LruCache<字符串,位图>
缓存=新LruCache&所述;字符串,位图>(20);
@覆盖
公共位图getBitmap(字符串URL){
返回cache.get(URL);
}
@覆盖
公共无效putBitmap(字符串URL,位图位图){
cache.put(URL,位图);
}
});
}
同步MySingleton的getInstance(上下文的背景下)公共静态{
如果(mInstance == NULL){
mInstance =新MySingleton(上下文);
}
返回mInstance;
}
公共请求队列getRequestQueue(){
如果(mRequestQueue == NULL){
// getApplicationContext()是关键,它让你从泄漏
//活动或者如果有人经过之一的BroadcastReceiver。
mRequestQueue = Volley.newRequestQueue(mCtx.getApplicationContext());
}
返回mRequestQueue;
}
公众< T>无效addToRequestQueue(请求< T> REQ){
。getRequestQueue()加(REQ);
}
公共ImageLoader的getImageLoader(){
返回mImageLoader;
}
}
我能够获得图像和这样的方式显示出来,但我需要缓存,所以我想这将其添加到右侧的要求? ..任何帮助吗?
mNetworkImageView =(NetworkImageView)findViewById(R.id.ImageView);
mImageLoader = MySingleton.getInstance(本).getImageLoader();
mNetworkImageView.setImageUrl(IMAGE_URL,mImageLoader);
这是我的工作示例code。希望这有助于:
MainActivity.java:
进口...
公共类MainActivity延伸活动{
最后的语境mContext =这一点;
@覆盖
保护无效的onCreate(包savedInstanceState){
super.onCreate(savedInstanceState);
的setContentView(R.layout.activity_main);
NetworkImageView mNetworkImageView =(NetworkImageView)findViewById(R.id.networkImageView);
字符串mUrl =http://192.168.0.100/api/getimage;
mNetworkImageView.setImageUrl(mUrl,VolleySingleton.getInstance(mContext).getImageLoader());
}
...
}
VolleySingleton.java:
公共类VolleySingleton {
私有静态VolleySingleton mInstance;
私人请求队列mRequestQueue;
私人ImageLoader的mImageLoader;
私有静态语境mContext;
私人VolleySingleton(上下文的背景下){
mContext =背景;
mRequestQueue = getRequestQueue();
mImageLoader =新ImageLoader的(mRequestQueue,
新ImageLoader.ImageCache(){
私人最终LruCache<字符串,位图>
缓存=新LruCache&其中;>(20);
@覆盖
公共位图getBitmap(字符串URL){
返回cache.get(URL);
}
@覆盖
公共无效putBitmap(字符串URL,位图位图){
cache.put(URL,位图);
}
});
}
同步VolleySingleton的getInstance(上下文的背景下)公共静态{
如果(mInstance == NULL){
mInstance =新VolleySingleton(上下文);
}
返回mInstance;
}
私人请求队列getRequestQueue(){
如果(mRequestQueue == NULL){
// getApplicationContext()是关键,它让你从泄漏
//活动或者如果有人经过之一的BroadcastReceiver。
mRequestQueue = Volley.newRequestQueue(mContext.getApplicationContext(),10 * 1024 * 1024); //这个缓存
}
返回mRequestQueue;
}
公众< T>无效addToRequestQueue(请求< T> REQ){
。getRequestQueue()加(REQ);
}
公共ImageLoader的getImageLoader(){
返回mImageLoader;
}
}
activity_main.xml:
< LinearLayout中的xmlns:机器人=http://schemas.android.com/apk/res/android
的xmlns:工具=http://schemas.android.com/tools
机器人:layout_width =FILL_PARENT
机器人:layout_height =WRAP_CONTENT
机器人:方向=垂直
工具:上下文=MainActivity。>
< com.android.volley.toolbox.NetworkImageView
机器人:ID =@ + ID / networkImageView
机器人:layout_width =match_parent
机器人:layout_height =WRAP_CONTENT/>
< / LinearLayout中>
AndroidManifest.xml中:
< XML版本=1.0编码=UTF-8&GT?;
<舱单的xmlns:机器人=http://schemas.android.com/apk/res/android
包=com.example.volleyapp>
<使用-权限的Android:名称=android.permission.INTERNET对/>
<应用
机器人:allowBackup =真
机器人:图标=@纹理映射/ ic_launcher
机器人:标签=@字符串/ APP_NAME
机器人:主题=@风格/ AppTheme>
<活动
机器人:名称=。MainActivity
机器人:标签=@字符串/ APP_NAME>
<意向滤光器>
<作用机器人:名称=android.intent.action.MAIN/>
<类机器人:名称=android.intent.category.LAUNCHER/>
&所述; /意图滤光器>
< /活性GT;
< /用途>
< /舱单>
I am following up image cashing tutorial using Volley on Android developers, I am having problem with requesting an image request and caching it, I guess because of the singelton that I created (copied from the tutorial).
My Eclipse is giving error in the getInstance(this)
because this is context and I am requesting an image I guess.
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));
}
},
0,
0,
null,
new Response.ErrorListener() {
public void onErrorResponse(VolleyError error) {
// mImageView.setImageResource(R.drawable.ic_launcher);
}
});
MySingleton.getInstance(this).addToRequestQueue(request);
This is singleton:
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;
}
}
I am able to get the image and display it in such way , but I need to cache it , so I guess it to add it in a request right ? .. any help ?
mNetworkImageView = (NetworkImageView) findViewById(R.id.ImageView);
mImageLoader = MySingleton.getInstance(this).getImageLoader();
mNetworkImageView.setImageUrl(IMAGE_URL, mImageLoader);
This is my working sample code. Hope this help:
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>
这篇关于在安卓的getInstance排球错误(这一点)加时ImageLoader的的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!