Мне нужна помощь в отношении индикатора загрузки. В моем приложении есть вид переработчика со списком видеофайлов, и у каждого элемента есть круговой индикатор выполнения и кнопка загрузки. Когда я нажимаю кнопку загрузки, она должна обновляться с индикатором выполнения и работать в фоновом режиме. Когда я перехожу к другому занятию и возвращаюсь в тот же класс, тогда, если загрузка не завершилась, тогда это должно показать прогресс загрузки. Пожалуйста, помогите мне.
public class FeedsAdapterAudio extends
RecyclerView.Adapter<FeedsAdapterAudio.MyViewHolder> implements Filterable,
IDownload/*,MediaPlayer.OnCompletionListener,
SeekBar.OnSeekBarChangeListener*/
{
private List<RssFeed1> feedItems;
private List<RssFeed1> feedlistfitered;
private Context context;
private int downloadedSize = 0;
private int totalSize = 0;
private String strurl;
NotificationManager mNotifyManager;
NotificationCompat.Builder mBuilder;
InputStream inputStream;
FileOutputStream fileOutput;
String strurl1;
SharedPreferences aspenPreference;
SharedPreferences.Editor aspenPrefsEditor;
public FeedsAdapterAudio(Context context, List<RssFeed1> feedItems){
this.feedItems=feedItems;
this.context=context;
this.feedlistfitered = feedItems;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
aspenPreference = context.getSharedPreferences("tags", MODE_PRIVATE);
aspenPrefsEditor = aspenPreference.edit();
View view= LayoutInflater.from(context).inflate(R.layout.altitude_video_layout,parent,false);
return new MyViewHolder(view);
}
@Override
public void onBindViewHolder(final MyViewHolder holder, int position) {
try {
String varid = aspenPreference.getString("tag",null);
final RssFeed1 current=feedlistfitered.get(position);
holder.title1.setText(current.getTitle());
holder.desc.setText(Html.fromHtml(current.getDescription()));
Glide.with(context)
.load(current.getImage())
.into(holder.imageView);
holder.writername.setText(current.getKeywords());
String str= current.getLink();
strurl = str.substring(str.lastIndexOf("/") + 1);
try {
String path = Environment.getExternalStorageDirectory().toString()+"/cachefolder";
//File cacheDir = getCacheFolder(context);
final File file11 = new File(path,strurl);
File file = new File(path);
File files[] = file.listFiles();
for (File file1 : files) {
if (!file11.exists()) {
if (current.getLink().equals(varid)) {
holder.backblack.setVisibility(View.VISIBLE);
holder.beforedownload.setVisibility(View.VISIBLE);
} else {
holder.beforedownload.setVisibility(View.VISIBLE);
holder.afterdownload.setVisibility(View.GONE);
holder.backblack.setVisibility(View.GONE);
}
} else {
holder.afterdownload.setVisibility(View.VISIBLE);
holder.beforedownload.setVisibility(View.GONE);
holder.backblack.setVisibility(View.GONE);
holder.playimage.setOnClickListener(view -> {
Intent intent = new Intent(context, AudioView.class);
intent.putExtra("videourl", file11.getAbsolutePath());
intent.putExtra("image",current.getImage());
intent.putExtra("type","filepath");
context.startActivity(intent);
});
}
}
}
catch (NullPointerException e)
{System.out.print(e);}
holder.stramplayimage.setOnClickListener(v -> {
Intent intent = new Intent(context, AudioView.class);
intent.putExtra("videourl",current.getLink());
intent.putExtra("image",current.getImage());
intent.putExtra("type","link");
context.startActivity(intent);
});
holder.mydownloadsimage.setOnClickListener(v -> {
MainFragment.switchTab(11);
});
holder.downloadimage.setOnClickListener(view -> {
aspenPrefsEditor.putString("tag", current.getLink());
aspenPrefsEditor.apply();
holder.backblack.setVisibility(View.VISIBLE);
SharedPreferences preferences = context.getSharedPreferences("altitude", MODE_PRIVATE);
SharedPreferences.Editor editor = preferences.edit();
editor.putString("url", strurl);
editor.putString("title", current.getTitle());
editor.putString("image", current.getImage());
editor.putString("desc",current.getDescription());
editor.putString("writername",current.getKeywords());
editor.putString("id",current.getGuid());
editor.putString("type","audio");
editor.apply();
String channelId = context.getString(R.string.default_notification_channel_id);
mBuilder = new NotificationCompat.Builder(context, channelId)
.setSmallIcon(R.mipmap.icon)
.setContentTitle(current.getTitle())
.setAutoCancel(true);
mNotifyManager = (NotificationManager) context.getSystemService(NOTIFICATION_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel channel = new NotificationChannel(channelId, "Default channel", NotificationManager.IMPORTANCE_DEFAULT);
mNotifyManager.createNotificationChannel(channel);
}
mNotifyManager.notify(0, mBuilder.build());
new DownloadFileAsync(context,strurl, holder.donut_progress).execute(current.getLink());
});
}
catch (IndexOutOfBoundsException e)
{
e.printStackTrace();
}
}
@Override
public int getItemCount() {
if (feedlistfitered == null)
return 0;
return feedlistfitered.size();
}
@Override
public void resultPathTrack(String url, String path) {
}
class MyViewHolder extends RecyclerView.ViewHolder {
TextView title1, writername, desc;
RelativeLayout download,playdelete,playlayout,giflayout;
ImageView imageView, stramplayimage, downloadimage, playimage, mydownloadsimage, cancelimage;
RelativeLayout image_layout;
RelativeLayout video_layout, backblack;
VideoView videoViewplay;
ImageView buttonplay;
ImageView delete;
//ProgressBar gifimage;
GifImageView gifimage;
LinearLayout beforedownload, afterdownload;
DonutProgress donut_progress;
MyViewHolder(View itemView) {
super(itemView);
title1= itemView.findViewById(R.id.title1);
desc= itemView.findViewById(R.id.desc);
imageView= itemView.findViewById(R.id.imageview);
download = itemView.findViewById(R.id.download);
playdelete = itemView.findViewById(R.id.playdelete);
buttonplay = itemView.findViewById(R.id.buttonplay);
delete = itemView.findViewById(R.id.delete);
writername = itemView.findViewById(R.id.writername);
videoViewplay = itemView.findViewById(R.id.videoViewplay);
playlayout = itemView.findViewById(R.id.playlayout);
giflayout = itemView.findViewById(R.id.giflayout);
gifimage = itemView.findViewById(R.id.gifimage);
stramplayimage = itemView.findViewById(R.id.stramplayimage);
downloadimage = itemView.findViewById(R.id.downloadimage);
playimage = itemView.findViewById(R.id.playimage);
mydownloadsimage = itemView.findViewById(R.id.mydownloadsimage);
beforedownload = itemView.findViewById(R.id.beforedownload);
afterdownload = itemView.findViewById(R.id.afterdownload);
donut_progress = itemView.findViewById(R.id.donut_progress);
cancelimage = itemView.findViewById(R.id.cancelimage);
backblack = itemView.findViewById(R.id.backblack);
}
}
@SuppressLint("StaticFieldLeak")
class DownloadFileAsync extends AsyncTask<String, String, String> {
Context context;
String url;
DonutProgress donutProgress;
@Override
protected void onPreExecute() {
super.onPreExecute();
}
DownloadFileAsync(Context context,String url,DonutProgress donutProgress){
this.context=context;
this.url = url;
this.donutProgress = donutProgress;
}
@Override
protected String doInBackground(String... aurl) {
try {
URL url = new URL(aurl[0]);
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setRequestMethod("GET");
urlConnection.setDoOutput(true);
urlConnection.connect();
File cacheDir = getCacheFolder1(context);
String str1= aurl[0];
strurl1 = str1.substring(str1.lastIndexOf("/") + 1);
File cacheFile = new File(cacheDir, strurl1);
fileOutput = new FileOutputStream(cacheFile);
inputStream = urlConnection.getInputStream();
totalSize = urlConnection.getContentLength();
byte[] buffer = new byte[256000000];
int bufferLength = 0;
while ( (bufferLength = inputStream.read(buffer)) > 0 ) {
fileOutput.write(buffer, 0, bufferLength);
downloadedSize += bufferLength;
((Activity) context).runOnUiThread(new Runnable() {
public void run() {
publishProgress(""+(int)((totalSize*100)/downloadedSize));
}
});
}
fileOutput.close();
fileOutput.flush();
inputStream.close();
} catch (Exception e) {}
return null;
}
protected void onProgressUpdate(String... progress) {
mBuilder.setProgress(totalSize, downloadedSize, false);
mNotifyManager.notify(0, mBuilder.build());
donutProgress.setMax(100);
donutProgress.setProgress((downloadedSize*100)/totalSize);
}
@Override
protected void onPostExecute(String unused) {
/*mBuilder.setContentText("Download complete");
mBuilder.setProgress(0, 0, false);
mNotifyManager.notify(0, mBuilder.build());*/
notifyDataSetChanged();
mNotifyManager.cancelAll();
movefile(strurl1);
SharedPreferences preferences = context.getSharedPreferences("tags", 0);
preferences.edit().remove("tag").apply();
SharedPreferences preferences1 = context.getSharedPreferences("altitude", MODE_PRIVATE);
SharedPreferences.Editor editor = preferences1.edit();
String url = preferences1.getString("url", null);
String image = preferences1.getString("image", null);
String desc = preferences1.getString("desc", null);
String writername = preferences1.getString("writername", null);
String id = preferences1.getString("id", null);
String type = preferences1.getString("type", null);
String title = preferences1.getString("title", null);
@SuppressLint("StaticFieldLeak")
class SaveTask extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... voids) {
AltitudeModel altitudeModel = new AltitudeModel();
altitudeModel.setDescription(desc);
altitudeModel.setGuid(id);
altitudeModel.setImage(image);
altitudeModel.setKeywords(writername);
altitudeModel.setLink(url);
altitudeModel.setTitle(title);
altitudeModel.setType(type);
DatabaseClient.getInstance(MyApplication.getContext()).getAppDatabase()
.altituteDao().insert(altitudeModel);
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
editor.clear();
}
}
SaveTask st = new SaveTask();
st.execute();
}
}
private void movefile(String name)
{
File from = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/cachefolder1/"+name);
File to = new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/cachefolder/"+name);
from.renameTo(to);
}
private void showError(final String err){
((Activity) context).runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(context, err, Toast.LENGTH_LONG).show();
}
});
}
private File getCacheFolder(Context context) {
File cacheDir = null;
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
cacheDir = new File(Environment.getExternalStorageDirectory(), "cachefolder");
if(!cacheDir.isDirectory()) {
cacheDir.mkdirs();
}
}
if(!cacheDir.isDirectory()) {
cacheDir = context.getCacheDir();
}
return cacheDir;
}
private File getCacheFolder1(Context context) {
File cacheDir = null;
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
cacheDir = new File(Environment.getExternalStorageDirectory(), "cachefolder1");
if(!cacheDir.isDirectory()) {
cacheDir.mkdirs();
}
}
if(!cacheDir.isDirectory()) {
cacheDir = context.getCacheDir();
}
return cacheDir;
}
@Override
public Filter getFilter() {
return new Filter() {
@Override
protected FilterResults performFiltering(CharSequence charSequence) {
String charString = charSequence.toString();
if (charString.isEmpty()) {
feedlistfitered = feedItems;
} else {
ArrayList<RssFeed1> filteredList = new ArrayList<>();
for (RssFeed1 row : feedItems) {
if (row.getTitle().toLowerCase(Locale.getDefault()).contains(charSequence) || row.getKeywords().toLowerCase().contains(charSequence)) {
filteredList.add(row);
}
}
feedlistfitered = filteredList;
}
FilterResults filterResults = new FilterResults();
filterResults.values = feedlistfitered;
return filterResults;
}
@Override
protected void publishResults(CharSequence charSequence, FilterResults filterResults) {
feedlistfitered = (ArrayList<RssFeed1>) filterResults.values;
notifyDataSetChanged();
}
};
}}