Я использовал метод onCreateDialog, но был отменен.Как завершить диалог при завершении загрузки файла?
Теперь я использую класс, чтобы иметь возможность создавать Dialogs с DialogFragment, но у меня проблема при закрытии диалогового окна.
CustomDialogFragment Класс:
package com.teste.dialogfragment;
import android.app.Dialog;
import android.app.DialogFragment;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.Window;
public class CustomDialogFragment extends DialogFragment {
private ProgressDialog pDialog;
public static DialogFragment newInstance(int id) {
CustomDialogFragment frag = new CustomDialogFragment();
Bundle args = new Bundle();
args.putInt("dialog_id", id);
frag.setArguments(args);
return frag;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Log.i("teste RETORNO:", String.valueOf(getDialogId()));
switch (getDialogId()) {
case 0: // setamos como 0 (horizontal)
pDialog = new ProgressDialog(getActivity());
pDialog.setMessage("Wait...downlading file.");
pDialog.setIndeterminate(false);
pDialog.setMax(100);
pDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
pDialog.setCancelable(true);
pDialog.show();
return pDialog;
default:
return null;
}
}
@Override
public void onCancel(DialogInterface dialog) {
// use switch statement as the number of cancellable dialogs increase
//if (getDialogId() == Constants.SHOW_LOGIN_DIALOG) {
// cancel login here
//}
pDialog.dismiss();;
}
public int getDialogId() {
return getArguments().getInt("dialog_id");
}
}
И Основной класс.
общественный класс Activity_dashboard расширяет активность {
Button btnShowProgress;
public static final int progress_bar_type = 0;
private DialogFragment mDialogFragment = null;
// files to download
private static String file_url_file_01 = "http://www.teste.com.br/teste_01.json";
private static String file_url_file_02 = "http://www.teste.com.br/teste_02.json";
private static String file_url_file_03 = "http://www.teste.com.br/teste_03.json";
private static String file_url_file_04 = "http://www.teste.com.br/teste_04.json";
public static int MY_COUNT = 4;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.dashboard);
btnShowProgress = (Button) findViewById(R.id.btGetFiles);
btnShowProgress.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MY_COUNT = 4;
// starting new Async Task
new DownloadFileFromURL().execute(file_url_auditar, "teste_01.json");
new DownloadFileFromURL().execute(file_url_hospitais, "teste_02.json");
new DownloadFileFromURL().execute(file_url_pacientes, "teste_03.json");
new DownloadFileFromURL().execute(file_url_login, "teste_04.json");
}
});
}
/**
* Background Async Task
* */
class DownloadFileFromURL extends AsyncTask<String, String, String> {
@Override
protected void onPreExecute() {
if(MY_COUNT == 4){
super.onPreExecute();
FragmentManager manager = getFragmentManager();
mDialogFragment = CustomDialogFragment.newInstance(progress_bar_type);
mDialogFragment.show(manager, "dialog");
}
}
@Override
protected String doInBackground(String... f_url) {
int count;
try {
URL url = new URL(f_url[0]);
URLConnection conection = url.openConnection();
conection.connect();
// this will be useful so that you can show a tipical 0-100% progress bar
int lenghtOfFile = conection.getContentLength();
//file name
File pathToWrite = new File(Environment.getExternalStorageDirectory() + "/teste/");
File myFile = new File(pathToWrite, f_url[1]);
if(!pathToWrite.exists()){
pathToWrite.mkdirs();
}
// download the file
InputStream input = new BufferedInputStream(url.openStream(), 8192);
// Output stream
OutputStream output = new FileOutputStream(myFile, false);
byte data[] = new byte[1024];
long total = 0;
while ((count = input.read(data)) != -1) {
total += count;
// publishing the progress....
// After this onProgressUpdate will be called
publishProgress(""+(int)((total*100)/lenghtOfFile));
// writing data to file
output.write(data, 0, count);
}
// flushing output
output.flush();
// closing streams
output.close();
input.close();
MY_COUNT--;
} catch (Exception e) {
Log.e("Error: ", e.getMessage());
}
return null;
}
//protected void onProgressUpdate(Integer... values) {
//mDialogFragment.setProgress(values[0]);
//}
@Override
protected void onPostExecute(String file_url) {
if(MY_COUNT == 0){
Toast.makeText(getBaseContext(), "Files Updated!", Toast.LENGTH_LONG).show();
getFragmentManager().beginTransaction().remove(mDialogFragment).commitAllowingStateLoss();
mDialogFragment.dismiss();
}
}
}
Посмотрите, что я называю AsyncTask 4 раза, потому что я должен загрузить 4 файлов. Оказывается, что открывает диалог, но когда я называю OnPostExecute, он закрывает диалог:
protected void onPostExecute(String file_url) {
if(MY_COUNT == 0){
Toast.makeText(getBaseContext(), "Files Updated!", Toast.LENGTH_LONG).show();
getFragmentManager().beginTransaction().remove(mDialogFragment).commitAllowingStateLoss();
mDialogFragment.dismiss();
}
}
}
Он также имеет проблему, что я не мог пройти мимо прогресса на прогресс бар пойти как мы обновляем загрузив
protected void onProgressUpdate(Integer... values) {
mDialogFragment.setProgress(values[0]);
}
Не уверен, что я следую этому вопросу здесь. –
Итак, вы хотите закрыть диалог, когда все 4 загрузки завершены? создайте счетчик, увеличьте его, когда вы начнете загрузку, уменьшите его в onPostExecute, отпустите диалог, когда счетчик = 0. И только создайте и покажите диалог, если счетчик = 0. –
У меня есть MY_COUNT счетчик, и когда он достигает 3 (0-3 = 4), он показывает сообщение о том, что файлы были загружены и отправлены за закрытие диалогового окна inPostExecute, но не работает. 'if (MY_COUNT == 3) { \t Toast.makeText (getBaseContext()," Файлы, загруженные. ", Toast.LENGTH_LONG) .show(); \t getFragmentManager(). BeginTransaction(). Remove (mDialogFragment) .commitAllowingStateLoss(); \t mDialogFragment.dismiss(); } ' Окно кажется закрытым, оно мигает, но снова открывается. Если я нажму кнопку 3 раза, он закрывается. – Wesley