Volley中Singleton类的用途是什么?

时间:2016-12-13 11:32:15

标签: android android-studio singleton android-volley

我使用Volley库在Singleton类的帮助下下载图像 问题:

如果我使用单吨课程,我可以在一段时间内成功下载图像,并且我也注意到图像也可以使用单吨课程成功下载。

请问任何人告诉我单例类对我的代码有什么好处。

--------------------- Code 使用Singleton Class --------------- -----

MainActivity.java

public class MainActivity extends AppCompatActivity {
    Button response_click;
    TextView text_response;
    RequestQueue requestQueue;
    String server_url="http://i.imgur.com/7spzG.png";
    ImageView imageView;
    ImageRequest imageRequest;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        response_click=(Button) findViewById(R.id.click_response);
        text_response=(TextView) findViewById(R.id.text_response);
        imageView=(ImageView) findViewById(R.id.image_download);
    }//onCreate Ending
    public void response_click(View view){
   
        final ImageRequest imageRequest=new ImageRequest(server_url, new Response.Listener<Bitmap>() {
            @Override
            public void onResponse(Bitmap response) {
                imageView.setImageBitmap(response);
            }
        }, 0, 0, null, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Toast.makeText(getApplicationContext(),"You Got an Error....",Toast.LENGTH_LONG).show();

            }
        });
MySingleTon.getInstance(MainActivity.this).addToRequestQue(imageRequest);

    }//Button Click Ending
}//Main Activity Ending
        

MySingleTon.java

public class MySingleTon {
    private static MySingleTon mySingleTon;
    private RequestQueue requestQueue;
    private static Context mctx;
    private MySingleTon(Context context){
        this.mctx=context;
        this.requestQueue=getRequestQueue();

    }
    public RequestQueue getRequestQueue(){
        if (requestQueue==null){
            requestQueue= Volley.newRequestQueue(mctx.getApplicationContext());
        }
        return requestQueue;
    }
   public static synchronized MySingleTon getInstance(Context context){
       if (mySingleTon==null){
           mySingleTon=new MySingleTon(context);
       }
       return mySingleTon;
   }
    public<T> void addToRequestQue(Request<T> request){
        requestQueue.add(request);

    }
}
    

在这里,我使用Singleton类编写了一个用于下载图像的代码。请检查此代码。
在这里记住一件事,在使用Singleton类的同时我也完成了我的工作,没有任何错误。

------------------------ code With Out Singleton class ----------- ------------

MainActivity.java

public class MainActivity extends AppCompatActivity {
    Button response_click;
    TextView text_response;
    RequestQueue requestQueue;
    String server_url="http://i.imgur.com/7spzG.png";
    ImageView imageView;
    ImageRequest imageRequest;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        response_click=(Button) findViewById(R.id.click_response);
        text_response=(TextView) findViewById(R.id.text_response);
        imageView=(ImageView) findViewById(R.id.image_download);
    }//onCreate Ending
    public void response_click(View view){
        requestQueue=Volley.newRequestQueue(this.getApplicationContext());
        final ImageRequest imageRequest=new ImageRequest(server_url, new Response.Listener<Bitmap>() {
            @Override
            public void onResponse(Bitmap response) {
                imageView.setImageBitmap(response);
            }
        }, 0, 0, null, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Toast.makeText(getApplicationContext(),"You Got an Error....",Toast.LENGTH_LONG).show();

            }
        });

        requestQueue.add(imageRequest);
        
    }//Button Click Ending
}//Main Activity Ending

2 个答案:

答案 0 :(得分:5)

如果您的应用程序持续使用网络,那么设置一个RequestQueue实例可能会最有效,该实例将持续您的应用程序的生命周期。您可以通过各种方式实现这一目标。推荐的方法是实现封装RequestQueue和其他Volley功能的单例类。另一种方法是子类Application并在Application.onCreate()中设置RequestQueue。但是这种方法是不鼓励的;静态单例可以以更模块化的方式提供相同的功能。

一个关键概念是RequestQueue必须使用Application上下文实例化,而不是Activity上下文。这可确保RequestQueue将持续应用程序的生命周期,而不是每次重新创建活动时重新创建(例如,当用户旋转设备时)。

阅读文档https://developer.android.com/training/volley/requestqueue.html#singleton

答案 1 :(得分:0)

您的单例类包含对上下文的静态引用,这可能导致内存泄漏

相反,您可以使用这样的应用程序实例

public class AppController extends Application {
  
    public static final String TAG = AppController.class.getSimpleName();
  
    private RequestQueue mRequestQueue;
  
    private static AppController mInstance;
  
    @Override
    public void onCreate() {
        super.onCreate();
        mInstance = this;
    }
  
    public static synchronized AppController getInstance() {
        return mInstance;
    }
  
    public RequestQueue getRequestQueue() {
        if (mRequestQueue == null) {
            mRequestQueue = Volley.newRequestQueue(getApplicationContext());
        }
  
        return mRequestQueue;
    }
  
    public <T> void addToRequestQueue(Request<T> req, String tag) {
        req.setTag(TextUtils.isEmpty(tag) ? TAG : tag);
        getRequestQueue().add(req);
    }
  
    public <T> void addToRequestQueue(Request<T> req) {
        req.setTag(TAG);
        getRequestQueue().add(req);
    }
  
    public void cancelPendingRequests(Object tag) {
        if (mRequestQueue != null) {
            mRequestQueue.cancelAll(tag);
        }
    }
}

并将此类添加到清单中的应用程序名称中

<application
   android:name=".AppController"
   android:icon="@mipmap/ic_launcher">