Volleyライブラリを使用して、シングルトンクラスを使用して画像をダウンロードしました。
問題:
シングルトンクラスを使用した場合、一度に画像を正常にダウンロードできます。また、シングルトンクラスを使用しなくても画像が正常にダウンロードされることに気付きました。
誰かが私のコードにシングルトンクラスの利点は何であるか教えてくれませんか。
---------------------コードシングルトンクラスを使用 ------------------ ---
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クラスを使用せずにイメージをダウンロードするためのコードを記述します。このコードも確認してください。
ここで1つ覚えておいてください。シングルトンクラスを使用せずに、エラーなしで仕事をしました。
------------------------コードシングルトンクラスなし -------------- ---------
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
アプリケーションがネットワークを常に使用している場合は、アプリの存続期間中続くRequestQueueの単一インスタンスを設定するのがおそらく最も効率的です。これはさまざまな方法で実現できます。推奨されるアプローチは、RequestQueueおよびその他のVolley機能をカプセル化するシングルトンクラスを実装することです。もう1つのアプローチは、Applicationをサブクラス化し、Application.onCreate()でRequestQueueを設定することです。ただし、このアプローチはお勧めしません。静的シングルトンは、よりモジュール化された方法で同じ機能を提供できます。
重要な概念は、RequestQueueは、アクティビティコンテキストではなく、アプリケーションコンテキストでインスタンス化する必要があるということです。これにより、アクティビティが再作成されるたびに(たとえば、ユーザーがデバイスを回転したときに)再作成されるのではなく、RequestQueueがアプリの存続期間中持続することが保証されます。
ドキュメントを読む https://developer.Android.com/training/volley/requestqueue.html#singleton