ProgressDialog beim Activity Start (Async Task)

S

soma-web

App-Anbieter (kostenpfl.)
19
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
 
Zuletzt bearbeitet:
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 ;-)
 
  • Danke
Reaktionen: soma-web
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
 
  • Danke
Reaktionen: soma-web
lass den Dialog lieber in onPreExecute anzeigen sonst funktionierts nich :D

ansonsten s.o. :)

MfG nijoX
 
  • Danke
Reaktionen: soma-web
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.
 
  • Danke
Reaktionen: soma-web
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.
 

Ähnliche Themen

S
  • Sempervivum
Antworten
2
Aufrufe
593
Sempervivum
S
Laser5001
  • Laser5001
Antworten
2
Aufrufe
870
Laser5001
Laser5001
M
  • maksimilian
Antworten
15
Aufrufe
1.654
maksimilian
M
Zurück
Oben Unten