[英]ProgressDialog doesn't show until doInBackground() is complete
我似乎無法想出這個。 我是android的新手,我正在嘗試從我的網站查詢數據庫時顯示一個對話框。 代碼正常運行,除了在doInBackground()完成之前ProgressDialog不顯示的事實,不應該是這種情況。
這是代碼
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
直到...(長時間停頓)之后我才看到對話框,它只顯示一瞬間。 暫停后的行發生得太快我不確定對話框開始顯示的位置,但據我所知它應該在長時間停頓之前顯示,特別是因為我看到日志“顯示對話框”
有人可以幫我弄清楚為什么我的對話框會在最后一刻顯示出來嗎?
你需要在doInBackground()
以某種方式發布你的進度
private class MyAsyncTask extends AsyncTask<Null , Int, Null>
{ ...
doInBackground(...)
{
....
publishProgress(Progress_metric ...)
}
試試這個.....創建你的private ProgressDialog mProgressDialog;
在你的活動中。
onCreate(.....) {
...........
...........
mProgressDialog = new ProgressDialog(this);
}
現在剩余的進程與您在異步任務中執行的操作相同。 就像@PearsonArtPhoto所提到的那樣
private class MyAsyncTask extends AsyncTask<Null , Int, Null>
{ ...
doInBackground(...)
{
....
publishProgress(Progress_metric ...);
}
......
......
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.