Jetzt kostenlos registrieren. Mitglieder surfen ohne Werbung auf Android-Hilfe.de!
Zurück   Android-Hilfe.de > Android Developer > Android App Entwicklung

ProgressDialog beim Activity Start (Async Task)

Das Thema "ProgressDialog beim Activity Start (Async Task)" befindet sich unter Android App Entwicklung auf Android-Hilfe.de.


Antwort

 

Themen-Optionen Ansicht
Alt 24.11.2011, 16:57   #1 (permalink)
Android-Hilfe.de Mitglied

Registriert seit: 06.07.2011
Beiträge: 71
Abgegebene Danke: 14
Erhielt 7 Danke für 7 Beiträge
Standard ProgressDialog beim Activity Start (Async Task)

Hi Ah Community,
kann mir bitte jemand sagen wieso bei dem Activity Start der ProgressDialog nicht gleich von anfang an angezeigt wird?
Ich öffne diese Activity durch das klicken eines Buttons in der MainActivity, danach dauert es etwa 3 sekunden, in denen er noch in der MainActivity stehen bleibt(sau blöd), dann scheint für kurze Zeit der ProgressDialog, dann ist er auch wieder weg und er zeigt die NewsActivity.
Ich würde gern den ProgressDialog gleich nach dem klicken des Buttons zeigen lassen, aber wo setze ich da den ProgressDialog an?
Zur Info: Die NewsActivity soll Inhalt aus einer SQL Datenbank abfragen und diesen in einer ListView anzeigen.
Code:
public class NewsActivity extends Activity implements OnItemClickListener {
	ListView lview3;
	ListViewCustomAdapter adapter;
	private ArrayList<News> itemList;
	Context context;
	private ProgressDialog progressDialog;
	@Override
	protected void onCreate(Bundle savedInstanceState) {


		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.news);
		context = this;
		itemList = new ArrayList<News>();
		progressDialog = ProgressDialog.show(this, "", "Loading...");

		GetTask serverTaskObject = new GetTask();
		serverTaskObject.execute();
		try {
			itemList = serverTaskObject.get();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ExecutionException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		lview3 = (ListView) findViewById(R.id.listView1);
		adapter = new ListViewCustomAdapter(this, itemList);
		lview3.setAdapter(adapter);

		lview3.setOnItemClickListener(this);
		
	}


	class GetTask extends AsyncTask<Void, Void, ArrayList<News>> {
		
		@Override
		protected ArrayList<News> doInBackground(Void... params) {
			// TODO Auto-generated method stub
			ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
			nameValuePairs.add(new BasicNameValuePair("year", "1980"));
			HttpResponse response = null;
			String result = null;

			StringBuilder sb = null;
			String result1 = null;
			InputStream is = null;
			ArrayList<News> itemList = new ArrayList<News>();
			try {
				HttpClient httpclient = new DefaultHttpClient();
				HttpPost httppost = new HttpPost(
						"http://prog-frog.cwsurf.de/news.php");
				httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
				response = httpclient.execute(httppost);
				HttpEntity entity = response.getEntity();				
				is = entity.getContent();
			} catch (Exception e) {
				Log.e("log_tag", "Error converting result " + e.toString());
			}
			try {
				BufferedReader reader = new BufferedReader(new InputStreamReader(
						is, "iso-8859-1"), 8);
				StringBuilder sb1 = new StringBuilder();
				String line = null;
				while ((line = reader.readLine()) != null) {
					sb1.append(line + "\n");
				}
				is.close();

				result1 = sb1.toString();
			} catch (Exception e) {
				Log.e("log_tag", "Error converting result " + e.toString());
			}

			// parse json data
			try {
				JSONArray jArray = new JSONArray(result1);
				for (int i = 0; i < jArray.length(); i++) {
					JSONObject json_data = jArray.getJSONObject(i);
					News tempnews = new News();
					tempnews.setContent(json_data.getString("content"));
					tempnews.setHeader(json_data.getString("header"));
					// tempnews.setDate(Date.valueOf(json_data.getString("date")));

					Log.i("log_tag", "id: " + json_data.getInt("id") + ", header: "
							+ json_data.getString("header") + ", content: "
							+ json_data.getString("content") + ", date: "
							+ json_data.getString("date"));
					itemList.add(tempnews);
				}

			} catch (JSONException e) {
				Log.e("log_tag", "Error parsing data " + e.toString());
			}
			return itemList;
		}

		protected void onPostExecute(ArrayList<News> result) {
			NewsActivity.this.progressDialog.dismiss();
		}

	}

}

Danke euch schonmal im Vorraus!

grüße soma

Geändert von soma-web (24.11.2011 um 17:07 Uhr)
soma-web ist offline   Mit Zitat antworten
Alt 25.11.2011, 07:38   #2 (permalink)
Fortgeschrittenes Mitglied

Modell: HTC Sensation

Registriert seit: 31.08.2011
Beiträge: 390
Abgegebene Danke: 25
Erhielt 59 Danke für 57 Beiträge
Standard AW: ProgressDialog beim Activity Start (Async Task)

ich denke, das ist eins deiner Probleme:

public final Result get ()
Since: API Level 3
Waits if necessary for the computation to complete, and then retrieves its result.

Returns
The computed result.
Throws
CancellationException If the computation was cancelled.
ExecutionException If the computation threw an exception.
InterruptedException If the current thread was interrupted while waiting.


Du machst zwar einen schönen Thread, aber durch den Aufruf von get() wartest du, bis der Thread seine Arbeit getan hat. Damit blockst du dir deine UI, als hättest du keinen Thread verwendet ;-)

Ich hab zwar mit AsyncTask noch nicht viel gearbeitet, da ich eher der klassische Thread-Fan bin *gg* aber ich denke, du solltest deine ListView in onPostExecute aktualisieren.

Weiterhin würde ich alle GUI-Komponenten (also auch die ListView und den Adapter) vor dem Dialog und dem Thread-Aufruf initialisieren.

Den Dialog könntest du auch erst mal nur initialisieren und dann im doBackground anzeigen lassen.

Hmm, glaub mehr fällt mir jetzt nicht ein ;-)
Tom299 ist offline   Mit Zitat antworten
Folgender Benutzer bedankt sich bei Tom299 für diesen Beitrag:
soma-web (25.11.2011)
Alt 25.11.2011, 09:31   #3 (permalink)
Android Guru

Registriert seit: 09.05.2009
Beiträge: 2.389
Abgegebene Danke: 36
Erhielt 307 Danke für 289 Beiträge
Standard AW: ProgressDialog beim Activity Start (Async Task)

du musst sämtliche Netzwerkoperationen in den AsyncTask packen.

so startest du zwar den task, wartest aber danach direkt auf das result

der typische ablauf sieht so aus.

task erzeugen
task starten
task durchlaufen
task result liefern

du musst dann in deiner activity etwas mit dem result machen. bis dahin wird der code parallel abgearbeitet. sonst hätte der thread/task ja keinen sinn
__________________
App Entwicklung
Latest apps: Media Streamer BETA | DailyCash | MoneyManager ( PRO | HD )
swordi ist offline   Mit Zitat antworten
Folgender Benutzer bedankt sich bei swordi für diesen Beitrag:
soma-web (25.11.2011)
Alt 25.11.2011, 09:40   #4 (permalink)
Junior Mitglied

Registriert seit: 06.09.2011
Beiträge: 38
Abgegebene Danke: 2
Erhielt 5 Danke für 5 Beiträge
Standard AW: ProgressDialog beim Activity Start (Async Task)

lass den Dialog lieber in onPreExecute anzeigen sonst funktionierts nich

ansonsten s.o.

MfG nijoX
nijoX ist offline   Mit Zitat antworten
Folgender Benutzer bedankt sich bei nijoX für diesen Beitrag:
soma-web (25.11.2011)
Alt 25.11.2011, 09:43   #5 (permalink)
Android Guru

Registriert seit: 09.05.2009
Beiträge: 2.389
Abgegebene Danke: 36
Erhielt 307 Danke für 289 Beiträge
Standard AW: ProgressDialog beim Activity Start (Async Task)

naja funktioniert schon so auch, jedoch nur, wenn der ui thread nicht blockiert wird.

es wird ja nichts angezeigt, bevor oncreate/onresume nicht fertig ist.
__________________
App Entwicklung
Latest apps: Media Streamer BETA | DailyCash | MoneyManager ( PRO | HD )
swordi ist offline   Mit Zitat antworten
Folgender Benutzer bedankt sich bei swordi für diesen Beitrag:
soma-web (25.11.2011)
Alt 25.11.2011, 12:07   #6 (permalink)
Android-Hilfe.de Mitglied

Registriert seit: 06.07.2011
Beiträge: 71
Abgegebene Danke: 14
Erhielt 7 Danke für 7 Beiträge
Standard AW: ProgressDialog beim Activity Start (Async Task)

Ja sehr nice, das wars, hab echt den UI Thread voll zerstört

jetzige Lösung sieht so aus:
Code:
public class NewsActivity extends Activity implements OnItemClickListener {
	public static ListView lview3;
	ListViewCustomAdapter adapter;
	private ArrayList<News> itemList;
	Context context;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.news);
		context = this;
		itemList = new ArrayList<News>();
		

		GetTask serverTaskObject = new GetTask();
		serverTaskObject.execute();
		
	}

	@Override
	public void onItemClick(AdapterView<?> arg0, View arg1, int position,
			long id) {
		// TODO Auto-generated method stub
		// ItemBean bean = (ItemBean) adapter.getItem(position);
		News bean = (News) adapter.getItem(position);
		Toast.makeText(
				this,
				"Title => " + bean.getHeader() + " \n Description => "
						+ bean.getContent(), Toast.LENGTH_SHORT).show();
		// Intent intent = new
		// Intent("de.prog.frog.happytimes.cocktails.COCKTAILSDETAIL");
		// intent.putExtra("id", bean.getId());
		// startActivity(intent);
	}

	


	class GetTask extends AsyncTask<Void, Void, ArrayList<News>> {
		private ProgressDialog progressDialog;
		@Override
		protected void onPreExecute() {
			// TODO Auto-generated method stub
			super.onPreExecute();
			progressDialog = ProgressDialog.show(NewsActivity.this, "", "Loading...");
		}
		
		@Override
		protected ArrayList<News> doInBackground(Void... params) {
			// TODO Auto-generated method stub
			ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
			nameValuePairs.add(new BasicNameValuePair("year", "1980"));
			HttpResponse response = null;
			String result = null;

			StringBuilder sb = null;
			String result1 = null;
			InputStream is = null;
			ArrayList<News> itemList = new ArrayList<News>();
			try {
				HttpClient httpclient = new DefaultHttpClient();
				HttpPost httppost = new HttpPost(
						"http://somaweb.so.funpic.de/news.php");
				httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
				response = httpclient.execute(httppost);
				HttpEntity entity = response.getEntity();				
				is = entity.getContent();
			} catch (Exception e) {
				Log.e("log_tag", "Error converting result " + e.toString());
			}
			try {
				BufferedReader reader = new BufferedReader(new InputStreamReader(
						is, "iso-8859-1"), 8);
				StringBuilder sb1 = new StringBuilder();
				String line = null;
				while ((line = reader.readLine()) != null) {
					sb1.append(line + "\n");
				}
				is.close();

				result1 = sb1.toString();
			} catch (Exception e) {
				Log.e("log_tag", "Error converting result " + e.toString());
			}

			// parse json data
			try {
				JSONArray jArray = new JSONArray(result1);
				for (int i = 0; i < jArray.length(); i++) {
					JSONObject json_data = jArray.getJSONObject(i);
					News tempnews = new News();
					tempnews.setContent(json_data.getString("content"));
					tempnews.setHeader(json_data.getString("header"));
					SimpleDateFormat form = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
					Date date = (Date) form.parse(json_data.getString("date"));
					Log.i("log_tag", "id: " + json_data.getInt("id") + ", header: "
							+ json_data.getString("header") + ", content: "
							+ json_data.getString("content") + ", date: "
							+ json_data.getString("date"));
					itemList.add(tempnews);
				}

			} catch (JSONException e) {
				Log.e("log_tag", "Error parsing data " + e.toString());
			} catch (ParseException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			return itemList;
		}

		protected void onPostExecute(ArrayList<News> result) {
			
			NewsActivity.lview3 = (ListView) findViewById(R.id.listView1);
			adapter = new ListViewCustomAdapter(NewsActivity.this, result);
			NewsActivity.lview3.setAdapter(adapter);
			NewsActivity.lview3.setOnItemClickListener(NewsActivity.this);
			
			progressDialog.dismiss();
		}

	}

}
Fazit: Baue die ListView auch im AsyncTask und alle Welt ist zufrieden!

DANKE EUCH, Falls noch etwas nicht stimmt nehme ich Kritik gerne an.
soma-web ist offline   Mit Zitat antworten
Antwort

Stichworte
-

Themen-Optionen
Ansicht


Ähnliche Themen

Thema Autor Forum Antworten Letzter Beitrag
Toast in einem Async-Task anzeigen samarek Android App Entwicklung 2 24.11.2011 10:36
Handy schaltet sich ab nach Start der Kamera-Activity TiJay Android App Entwicklung 2 05.04.2011 14:13
Xvid + Hardware Decoding = Async? Bjoeki Motorola Defy Forum 0 27.01.2011 07:27
Chronometer start()-Methode wenn Activity im Hintergrund DKR82 Android App Entwicklung 1 23.11.2010 17:58
Unable to start activity ComponentInfo HeroUser96 Android App Entwicklung 7 14.11.2010 12:12




Du liest gerade: "ProgressDialog beim Activity Start (Async Task)" unter "Android App Entwicklung" auf Android-Hilfe.de.


Powered by vBulletin®
Copyright ©2000 - 2012, vBulletin Solutions, Inc.
Search Engine Friendly URLs by vBSEO
© Android-Hilfe.de 2012 - All rights reserved.