Soruma gelirsek internet üzerinden hali hazırda ayarladığım ses dosyalarını çoklu bir şekilde indirme yapmam gerekiyor ancak volley kullanırken asekron yapıda çalıştığı için for içinde sorun oluştuğunu fark ettim bende bir Thread.sleep(200) koyarak işi biraz yavaşlattım. Çalışmaya çalıştı ancak doğru olmadığını ve doğrusunu öğrenmek adına daha iyi nasıl yaparım diye sormak istedim.
İşte kodlarım:
public class InputStreamVolleyRequest extends Request<byte[]> { private final Response.Listener<byte[]> mListener; private Map<String, String> mParams; //create a static map for directly accessing headers public Map<String, String> responseHeaders; public InputStreamVolleyRequest(int method, String mUrl, Response.Listener<byte[]> listener, Response.ErrorListener errorListener, HashMap<String, String> params) { // TODO Auto-generated constructor stub super(method, mUrl, errorListener); // this request would never use cache. setShouldCache(false); mListener = listener; mParams = params; } @Override protected Map<String, String> getParams() throws com.android.volley.AuthFailureError { return mParams; } @Override protected Response<byte[]> parseNetworkResponse(NetworkResponse response) { //Initialise local responseHeaders map with response headers received responseHeaders = response.headers; //Pass the response data here return Response.success(response.data, HttpHeaderParser.parseCacheHeaders(response)); } @Override protected void deliverResponse(byte[] response) { mListener.onResponse(response); } }Bu özelleştirilmiş Volley request classım
class GetDowlandFile2 extends AsyncTask<String, Integer, String> { private ProgressDialog progressDialog; private KuranSound kuranSound; private List<KuranAyet> kuranAyetList; private NotificationManager mNotifyManager; private NotificationCompat.Builder mBuilder; private String channelId = "DowlandFile"; private InputStream input; private BufferedOutputStream output; public GetDowlandFile2(KuranSound kuranSound, List<KuranAyet> kuranAyetList) { this.kuranSound = kuranSound; this.kuranAyetList = kuranAyetList; } @Override protected void onPreExecute() { super.onPreExecute(); progressDialog = new ProgressDialog(view.getContext()); progressDialog.setMax(kuranAyetList.size()); progressDialog.setTitle(getSTR(R.string.app_name)); progressDialog.setMessage(getSTR(R.string.progress_dialog2)); progressDialog.setProgress(0); progressDialog.setCancelable(false); progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); progressDialog.show(); mNotifyManager = (NotificationManager) view.getContext().getSystemService(Context.NOTIFICATION_SERVICE); mBuilder = new NotificationCompat.Builder(view.getContext(), channelId); mBuilder.setContentTitle(getSTR(R.string.app_name)) .setContentText(getSTR(R.string.progress_dialog2)) .setSmallIcon(R.drawable.ic_stat_vaktinde); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { NotificationChannel channel = new NotificationChannel(channelId, "Dosya İndirme", NotificationManager.IMPORTANCE_LOW); mNotifyManager.createNotificationChannel(channel); } } @Override protected String doInBackground(String... f_url) { try { File f = new File(view.getContext().getExternalCacheDir(), "KuranSound/" + kuranSound.getLink()); //Eğer dosya yoksa oluştur if (!f.exists()) { f.mkdirs(); } for (int i = 0; i < kuranAyetList.size(); i++) { File soundFile = new File(view.getContext().getExternalCacheDir(), "KuranSound/" + kuranSound.getLink() + "/" + kuranAyetList.get(i).getSureno() + "_" + kuranAyetList.get(i).getAyetno() + ".mp3"); if (!soundFile.exists()) { final int finalI = i; InputStreamVolleyRequest request = new InputStreamVolleyRequest(Request.Method.GET, view.getContext().getResources().getString(R.string.api_kuran) + kuranSound.getLink() + "/" + kuranAyetList.get(i).getSureno() + "_" + kuranAyetList.get(i).getAyetno() + ".mp3", new Response.Listener<byte[]>() { @Override public void onResponse(byte[] response) { // TODO handle the response try { if (response != null) { int count; try { input = new ByteArrayInputStream(response); File sdCardDirectory = view.getContext().getExternalCacheDir(); File dowlandFile = new File(sdCardDirectory, "KuranSound/" + kuranSound.getLink() + "/" + kuranAyetList.get(finalI).getSureno() + "_" + kuranAyetList.get(finalI).getAyetno() + ".mp3"); output = new BufferedOutputStream(new FileOutputStream(dowlandFile)); byte[] data = new byte[1024]; long total = 0; while ((count = input.read(data)) != -1) { total += count; output.write(data, 0, count); } } catch (IOException e) { e.printStackTrace(); } } } catch (Exception e) { // TODO Auto-generated catch block Log.d("KEY_ERROR", "UNABLE TO DOWNLOAD FILE"); e.printStackTrace(); } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { // TODO handle the error error.printStackTrace(); } }, null); RequestQueue mRequestQueue = Volley.newRequestQueue(view.getContext(), new HurlStack()); request.setRetryPolicy(new DefaultRetryPolicy(50000, 5, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT)); mRequestQueue.add(request); } //volley ile veri indirirken bir // öncekinin işleminin bitmesi beklenmediği // için burada bir bekleme ayarladım ancak çok sağlıklı değil. Thread.sleep(200); publishProgress(i + 1); mBuilder.setProgress(kuranAyetList.size(), i + 1, false); mNotifyManager.notify(10, mBuilder.build()); } output.flush(); output.close(); input.close(); } catch (Exception e) { e.printStackTrace(); } return null; } @Override protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); Integer currentProgress = values[0]; progressDialog.setProgress(currentProgress); } @Override protected void onPostExecute(String file_url) { if (progressDialog != null) { progressDialog.dismiss(); kuranPageFragment.setKuanAyetExists(); mBuilder.setContentText("İndirme Tamamlandı.").setProgress(0, 0, false); mNotifyManager.notify(10, mBuilder.build()); mNotifyManager.cancel(10); KuranSoundFragment.this.dismiss(); } } }Buda verileri indirmek için kullandığım AsyncTask classım.
Sorumu yinelemek gerekir ise Thread.sleep(200) olmaz ise yapı yanlış çalışıyor bası dosyaları indirmiyor. Sebebi az çok belli for içinde volley kütüphanesi asekron çalışıyor ancak bunun önüne nasıl başka yoldan geçerim. Yardımlarınızı bekliyorum. Teşekkürler.