我使用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
答案 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">