| |||||||
Das Thema "ProgressDialog beim Activity Start (Async Task)" befindet sich unter Android App Entwicklung auf Android-Hilfe.de.
|
| | Themen-Optionen | Ansicht |
| | #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
| 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) |
| | |
| | #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
|
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 ;-) |
| | |
| Folgender Benutzer bedankt sich bei Tom299 für diesen Beitrag: | soma-web (25.11.2011) |
| | #3 (permalink) |
| Android Guru Registriert seit: 09.05.2009
Beiträge: 2.389
Abgegebene Danke: 36
Erhielt 307 Danke für 289 Beiträge
|
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 ) |
| | |
| Folgender Benutzer bedankt sich bei swordi für diesen Beitrag: | soma-web (25.11.2011) |
| | #4 (permalink) |
| Junior Mitglied Registriert seit: 06.09.2011
Beiträge: 38
Abgegebene Danke: 2
Erhielt 5 Danke für 5 Beiträge
|
lass den Dialog lieber in onPreExecute anzeigen sonst funktionierts nich ![]() ansonsten s.o. ![]() MfG nijoX |
| | |
| Folgender Benutzer bedankt sich bei nijoX für diesen Beitrag: | soma-web (25.11.2011) |
| | #5 (permalink) |
| Android Guru Registriert seit: 09.05.2009
Beiträge: 2.389
Abgegebene Danke: 36
Erhielt 307 Danke für 289 Beiträge
|
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 ) |
| | |
| Folgender Benutzer bedankt sich bei swordi für diesen Beitrag: | soma-web (25.11.2011) |
| | #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
|
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();
}
}
} DANKE EUCH, Falls noch etwas nicht stimmt nehme ich Kritik gerne an. |
| | |
![]() |
|
| Themen-Optionen | |
| Ansicht | |
| |
| ||||
| 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 |