在安卓的getInstance排球错误(这一点)加时ImageLoader的 [英] Android Volley error in getInstance(this) when adding ImageLoader

查看:188
本文介绍了在安卓的getInstance排球错误(这一点)加时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 =htt​​p://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:机器人=htt​​p://schemas.android.com/apk/res/android
    的xmlns:工具=htt​​p://schemas.android.com/tool​​s
    机器人: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:机器人=htt​​p://schemas.android.com/apk/res/android
    包=com.example.volleyapp>

    <使用-权限的Andr​​oid:名称=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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆