1. Nimm jetzt an unserem 2. ADVENT-Gewinnspiel teil - Alle Informationen findest Du hier!

ProgressDialog beim Activity Start (Async Task)

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von soma-web, 24.11.2011.

  1. soma-web, 24.11.2011 #1
    soma-web

    soma-web Threadstarter App-Anbieter (kostenpfl.)

    Beiträge:
    146
    Erhaltene Danke:
    18
    Registriert seit:
    06.07.2011
    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: 24.11.2011
  2. Tom299, 25.11.2011 #2
    Tom299

    Tom299 Android-Experte

    Beiträge:
    602
    Erhaltene Danke:
    120
    Registriert seit:
    31.08.2011
    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 ;-)
     
    soma-web bedankt sich.
  3. swordi, 25.11.2011 #3
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    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
     
    soma-web bedankt sich.
  4. nijoX, 25.11.2011 #4
    nijoX

    nijoX Junior Mitglied

    Beiträge:
    38
    Erhaltene Danke:
    5
    Registriert seit:
    06.09.2011
    lass den Dialog lieber in onPreExecute anzeigen sonst funktionierts nich :D

    ansonsten s.o. :)

    MfG nijoX
     
    soma-web bedankt sich.
  5. swordi, 25.11.2011 #5
    swordi

    swordi Gewerbliches Mitglied

    Beiträge:
    3,389
    Erhaltene Danke:
    441
    Registriert seit:
    09.05.2009
    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.
     
    soma-web bedankt sich.
  6. soma-web, 25.11.2011 #6
    soma-web

    soma-web Threadstarter App-Anbieter (kostenpfl.)

    Beiträge:
    146
    Erhaltene Danke:
    18
    Registriert seit:
    06.07.2011
    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.
     

Diese Seite empfehlen