studio programacion para móviles libro edición desarrollo desarrollar curso aprende aplicaciones android multithreading progressdialog

programacion - Mostrar ProgressDialog Android



manual de programacion android pdf (5)

Declara tu diálogo de progreso:

ProgressDialog progress;

Cuando esté listo para comenzar el diálogo de progreso:

progress = ProgressDialog.show(this, "dialog title", "dialog message", true);

y hacer que desaparezca cuando hayas terminado:

progress.dismiss();

Aquí hay un pequeño ejemplo de hilo para ti:

// Note: declare ProgressDialog progress as a field in your class. progress = ProgressDialog.show(this, "dialog title", "dialog message", true); new Thread(new Runnable() { @Override public void run() { // do the thing that takes a long time runOnUiThread(new Runnable() { @Override public void run() { progress.dismiss(); } }); } }).start();

Tengo un EditText que toma un String del usuario y un searchButton. Cuando se hace clic en searchButton, buscará en el archivo XML y lo mostrará en ListView.

Puedo tomar la información del usuario, buscar a través del archivo XML y mostrar el valor buscado por el usuario también en ListView.

Lo que quiero es mostrar un ProgressDialog después de hacer clic en searchButton como "POR FAVOR, ESPERE ... RECUPERAR DATOS ..." o algo así y descartarlo cuando se muestren los datos.

public class Tab1Activity extends ListActivity { private Button okButton; private Button searchButton; Toast toast; String xml; private TextView searchText; private String searchTextString; HashMap<String, String> o; ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>(); @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.tab1); searchButton = (Button) findViewById(R.id.search_button); searchButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { // TODO Auto-generated method stub System.out.print("hello"); searchText = (TextView) findViewById(R.id.search_text); searchTextString = searchText.getText().toString(); readXml(searchTextString); } }); } private void readXml(String searchTextString1) { ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>(); String xml = XMLfunctions.getXML(); //Here XMLfunctions is class name which parse xml Document doc = XMLfunctions.XMLfromString(xml); int numResults = XMLfunctions.numResults(doc); if ((numResults <= 0)) { Toast.makeText(Tab1Activity.this, "Testing xmlparser", Toast.LENGTH_LONG).show(); finish(); } NodeList nodes = doc.getElementsByTagName("result"); for (int i = 0; i < nodes.getLength(); i++) { HashMap<String, String> map = new HashMap<String, String>(); Element e = (Element) nodes.item(i); String nameMapString = XMLfunctions.getValue(e, "name"); if ( nameMapString.toLowerCase().indexOf(searchTextString1.toLowerCase()) != -1 ) // != -1 means string is present in the search string { map.put("id", XMLfunctions.getValue(e, "id")); map.put("name", XMLfunctions.getValue(e, "name")); map.put("Score", XMLfunctions.getValue(e, "score")); mylist.add(map); } } ListAdapter adapter = new SimpleAdapter(this, mylist, R.layout.parsexml, new String[] { "name", "Score" }, new int[] { R.id.item_title, R.id.item_subtitle }); setListAdapter(adapter); final ListView lv = getListView(); lv.setTextFilterEnabled(true); lv.setOnItemClickListener(new OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View view, int position, long id) { @SuppressWarnings("unchecked") HashMap<String, String> o = (HashMap<String, String>) lv .getItemAtPosition(position); Toast.makeText(Tab1Activity.this, "Name "+o.get("name")+" Clicked", Toast.LENGTH_LONG) .show(); } }); }


Estoy usando el siguiente código en uno de mis proyectos actuales donde descargo datos de Internet. Todo está dentro de mi clase de actividad.

// ---------------------------- START DownloadFileAsync // -----------------------// class DownloadFileAsync extends AsyncTask<String, String, String> { @Override protected void onPreExecute() { super.onPreExecute(); // DIALOG_DOWNLOAD_PROGRESS is defined as 0 at start of class showDialog(DIALOG_DOWNLOAD_PROGRESS); } @Override protected String doInBackground(String... urls) { try { String xmlUrl = urls[0]; URL u = new URL(xmlUrl); HttpURLConnection c = (HttpURLConnection) u.openConnection(); c.setRequestMethod("GET"); c.setDoOutput(true); c.connect(); int lengthOfFile = c.getContentLength(); InputStream in = c.getInputStream(); byte[] buffer = new byte[1024]; int len1 = 0; long total = 0; while ((len1 = in.read(buffer)) > 0) { total += len1; // total = total + len1 publishProgress("" + (int) ((total * 100) / lengthOfFile)); xmlContent += buffer; } } catch (Exception e) { Log.d("Downloader", e.getMessage()); } return null; } protected void onProgressUpdate(String... progress) { Log.d("ANDRO_ASYNC", progress[0]); mProgressDialog.setProgress(Integer.parseInt(progress[0])); } @Override protected void onPostExecute(String unused) { dismissDialog(DIALOG_DOWNLOAD_PROGRESS); } } @Override protected Dialog onCreateDialog(int id) { switch (id) { case DIALOG_DOWNLOAD_PROGRESS: mProgressDialog = new ProgressDialog(this); mProgressDialog.setMessage("Retrieving latest announcements..."); mProgressDialog.setIndeterminate(false); mProgressDialog.setMax(100); mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); mProgressDialog.setCancelable(true); mProgressDialog.show(); return mProgressDialog; default: return null; } }


Estoy usando el siguiente código en uno de mis proyectos actuales donde descargo datos de Internet. Todo está dentro de mi clase de actividad.

private class GetData extends AsyncTask<String, Void, JSONObject> { @Override protected void onPreExecute() { super.onPreExecute(); progressDialog = ProgressDialog.show(Calendar.this, "", ""); } @Override protected JSONObject doInBackground(String... params) { String response; try { HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost(url); HttpResponse responce = httpclient.execute(httppost); HttpEntity httpEntity = responce.getEntity(); response = EntityUtils.toString(httpEntity); Log.d("response is", response); return new JSONObject(response); } catch (Exception ex) { ex.printStackTrace(); } return null; } @Override protected void onPostExecute(JSONObject result) { super.onPostExecute(result); progressDialog.dismiss(); if(result != null) { try { JSONObject jobj = result.getJSONObject("result"); String status = jobj.getString("status"); if(status.equals("true")) { JSONArray array = jobj.getJSONArray("data"); for(int x = 0; x < array.length(); x++) { HashMap<String, String> map = new HashMap<String, String>(); map.put("name", array.getJSONObject(x).getString("name")); map.put("date", array.getJSONObject(x).getString("date")); map.put("description", array.getJSONObject(x).getString("description")); list.add(map); } CalendarAdapter adapter = new CalendarAdapter(Calendar.this, list); list_of_calendar.setAdapter(adapter); } } catch (Exception e) { e.printStackTrace(); } } else { Toast.makeText(Calendar.this, "Network Problem", Toast.LENGTH_LONG).show(); } } }

y ejecutarlo en el método OnCreate como el new GetData().execute();

donde Calendar es mi calendarActivity y también he creado un CalendarAdapter para establecer estos valores en una vista de lista.


Mientras crea el objeto para la barra de progreso, compruebe lo siguiente.

Esto falla:

dialog = new ProgressDialog(getApplicationContext());

Al agregar el contexto de las actividades funciona ...

dialog = new ProgressDialog(MainActivity.this);


No debe ejecutar tareas intensivas en recursos en el hilo principal. Hará que la IU no responda y obtendrá un ANR. Parece que va a hacer un uso intensivo de recursos y quiere que el usuario vea el ProgressDialog . Puede echar un vistazo a http://developer.android.com/reference/android/os/AsyncTask.html para realizar tareas intensivas en recursos. También le muestra cómo usar un ProgressDialog .