簡體   English   中英

在doInBackground()完成之前,ProgressDialog不會顯示

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM