我似乎無法找出這一個。我是新來的Android,我試圖從我的網站查詢數據庫時顯示對話框。除了直到doInBackground()完成之後ProgressDialog不顯示的事實,代碼才能正常運行,而不應該出現這種情況。ProgressDialog不顯示,直到doInBackground()完成
下面是代碼
private class MyAsyncTask extends AsyncTask<Void, Void, Void> {
private ProgressDialog mProgressDialog;
private Context context;
private String taskResult;
public MyAsyncTask(Activity activity) {
context = activity;
mProgressDialog = new ProgressDialog(context);
}
@Override
protected void onPreExecute() {
mProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
mProgressDialog.setMessage("Performing Query...");
mProgressDialog.show();
Log.d("log_tag", "Showed dialog");
}
@Override
protected void onPostExecute(Void result) {
if (!error) {
Log.d("log_tag", "No ERROR - " + error);
JSONArray jArray;
List<Map<String, String>> lValues = new ArrayList<Map<String, String>>();
try{
jArray = new JSONArray(taskResult);
JSONObject json_data=null;
//Log.d("log_tag", "for loop to read data");
for(int i=0;i<jArray.length();i++){
json_data = jArray.getJSONObject(i);
Map<String, String> datum = new HashMap<String, String>(2);
datum.put("artist", json_data.getString("artist"));
datum.put("title", json_data.getString("title"));
lValues.add(datum);
}
} catch(JSONException e1){
Message("No Results Found");
} catch (ParseException e1) {
e1.printStackTrace();
}
lstResults.setAdapter(new SimpleAdapter(context, lValues,
android.R.layout.simple_expandable_list_item_2,
new String[] {"artist", "title"},
new int[] {android.R.id.text1, android.R.id.text2}));
} else {
Message("ERROR: " + errString);
error = false;
errString = "";
}
if (mProgressDialog.isShowing()) {
mProgressDialog.dismiss();
Log.d("log_tag", "Closed dialog");
}
}
@Override
protected Void doInBackground(Void... params) {
StringBuilder sb;
InputStream is = null;
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
nameValuePairs.add(new BasicNameValuePair("c_name", generateSearchCriteria()));
Log.d("log_tag", nameValuePairs.get(0).toString());
try{
Log.d("log_tag", "Create Object");
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(RHINOGOLD_URL);
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
is = entity.getContent();
}catch(Exception e){
errString = "Connection Error";
error = true;
Log.e("log_tag", "Error in http connection - " + error + " - " + e.toString());
}
//convert response to string
if (!error) {
Log.d("log_tag", "BufferedReader - " + error);
try{
BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
sb = new StringBuilder();
Log.d("log_tag", "append");
sb.append(reader.readLine() + "\n");
String line="0";
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
Log.d("log_tag", "close input stream");
is.close();
if (sb.toString() == null) {
taskResult = "No values returned";
} else {
taskResult=sb.toString();
}
} catch(Exception e) {
errString = "The application encountered an error";
error = true;
Log.e("log_tag", "Error converting result - " + error + " - " + e.toString());
}
}
return null;
}
}
我敢肯定有編程的擺在這裏沒有編號,但正如我所說,我是新,所以我還是搞清楚如何這一切工程。無論如何,正如你所看到的,我在這裏有一些日誌,我看着LogCat輸出來查看彈出對話框的時間,這裏是我得到的。
Showed dialog
c_name=artist LIKE 'journey' OR title LIKE 'journey'
Create Object
... (long pause)
BufferedReader - false
append
close input stream
No ERROR - false
Closed dialog
我沒有看到對話框,直到......(長暫停)之後,它只顯示一瞬間。暫停後的線條發生得太快我不確定對話框開始顯示的位置,但從我瞭解的應該顯示在長暫停之前,特別是因爲我看到日誌「顯示對話框」
有人可以請幫我弄清楚爲什麼我的對話在最後一刻出現?
當你創建對話框會發生什麼('mProgressDialog =新ProgressDialog(上下文);')'中onPreExecute()'或在您的活動? – Sam
如果你使用'mProgressDialog = ProgressDialog.show(context,「,」Performing Query ...「,true);'onPreExecute'而不是在它和構造函數之間分割它嗎? – Geobits
兩人都沒有工作,我不明白。 – Geoff