2012-11-15 53 views
0

我似乎無法找出這一個。我是新來的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 

我沒有看到對話框,直到......(長暫停)之後,它只顯示一瞬間。暫停後的線條發生得太快我不確定對話框開始顯示的位置,但從我瞭解的應該顯示在長暫停之前,特別是因爲我看到日誌「顯示對話框」

有人可以請幫我弄清楚爲什麼我的對話在最後一刻出現?

+0

當你創建對話框會發生什麼('mProgressDialog =新ProgressDialog(上下文);')'中onPreExecute()'或在您的活動? – Sam

+0

如果你使用'mProgressDialog = ProgressDialog.show(context,「,」Performing Query ...「,true);'onPreExecute'而不是在它和構造函數之間分割它嗎? – Geobits

+0

兩人都沒有工作,我不明白。 – Geoff

回答

1

您需要publish your progress不知何故doInBackground()

private class MyAsyncTask extends AsyncTask<Null , Int, Null> 
{ ... 
doInBackground(...) 
{ 
    .... 
    publishProgress(Progress_metric ...) 
} 
+0

我試過了,它似乎也做了同樣的事情。我把publishProgress()放在doInBackground()的開始,中間和結尾處,並且我覆蓋onProgressUpdate以打印一個Toast消息,其中增加了它被調用的時間。在長時間的停頓之後,我看到所有三個Toast消息都一個接一個地彈出,但是隻有在長時間的停頓之後纔會彈出。 – Geoff

1

試試這個..... 在你的活動創建private ProgressDialog mProgressDialog;

onCreate(.....) { 

    ........... 
    ........... 
    mProgressDialog = new ProgressDialog(this); 
} 

現在剩下的過程與您在異步任務中所做的相同。 只是這樣做,通過提到,@PearsonArtPhoto

private class MyAsyncTask extends AsyncTask<Null , Int, Null> 
{ ... 
     doInBackground(...) 
     { 
      .... 
      publishProgress(Progress_metric ...); 
     } 
     ...... 
     ...... 
}