Ich habe einen EditText, der dem Benutzer einen String und einen searchButton entnimmt. Wenn Sie auf den searchButton klicken, wird die XML-Datei durchsucht und in der ListView angezeigt.
Ich kann Eingaben vom Benutzer entgegennehmen, die XML-Datei durchsuchen und den vom Benutzer gesuchten Wert auch in der ListView anzeigen.
Was ich möchte, ist, ein anzuzeigen, ProgressDialog
nachdem auf den searchButton geklickt wurde, wie "BITTE WARTEN ... DATEN ABRUFEN ..." oder so etwas und es zu schließen, wenn die Daten angezeigt werden.
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();
}
});
}
android
multithreading
progressdialog
Captaindroid
quelle
quelle
Antworten:
Erklären Sie Ihren Fortschrittsdialog:
Wenn Sie bereit sind, den Fortschrittsdialog zu starten:
progress = ProgressDialog.show(this, "dialog title", "dialog message", true);
und damit es verschwindet, wenn du fertig bist:
progress.dismiss();
Hier ist ein kleines Thread-Beispiel für Sie:
// 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();
quelle
show
unddismiss
der Fortschrittsdialog im UI-Thread angezeigt werden.readXML
liegt es daran, dass die Benutzeroberfläche nicht zu Atem kommt. Vielleicht möchten Sie es in einen eigenen Thread einfügen - entweder mit simplenew Thread(...)
(was ich bevorzuge) oder mitAsyncTask
, wie Win Myo Htet vorschlägt.Ich verwende den folgenden Code in einem meiner aktuellen Projekte, in denen ich Daten aus dem Internet herunterlade. Es ist alles in meiner Aktivitätsklasse.
// ---------------------------- 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; } }
quelle
Überprüfen Sie beim Erstellen des Objekts für den Fortschrittsbalken Folgendes.
Dies schlägt fehl:
dialog = new ProgressDialog(getApplicationContext());
Beim Hinzufügen der Aktivitäten funktioniert der Kontext.
dialog = new ProgressDialog(MainActivity.this);
quelle
Sie sollten keine ressourcenintensiven Aufgaben im Hauptthread ausführen. Dadurch reagiert die Benutzeroberfläche nicht mehr und Sie erhalten eine ANR. Es scheint, als würden Sie ressourcenintensive Dinge tun und möchten, dass der Benutzer das sieht
ProgressDialog
. Unter http://developer.android.com/reference/android/os/AsyncTask.html können Sie ressourcenintensive Aufgaben ausführen. Es zeigt Ihnen auch, wie Sie a verwendenProgressDialog
.quelle
Ich verwende den folgenden Code in einem meiner aktuellen Projekte, in denen ich Daten aus dem Internet herunterlade. Es ist alles in meiner Aktivitätsklasse.
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(); } } }
und führen Sie es in der OnCreate-Methode wie aus
new GetData().execute();
Dabei ist Kalender meine Kalenderaktivität und ich habe auch einen Kalenderadapter erstellt, um diese Werte auf eine Listenansicht festzulegen.
quelle