2012-11-15 1 views
0

나는 이것을 알아낼 수 없습니다. 나는 안드로이드에 익숙하지 않고 웹 사이트에서 데이터베이스를 쿼리하는 동안 대화를 표시하려고합니다. doInBackground()가 완료 될 때까지 ProgressDialog가 표시되지 않는다는 점을 제외하고는 코드가 제대로 작동합니다. 여기 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 

... (긴 멈춤) 다음까지만 대화 상자가 표시되고 분할 초 만 표시됩니다. 일시 중지 후 줄이 너무 빨리 발생합니다. 정확히 어디에서 대화 상자가 표시되는지 알 수 없지만 긴 멈춤 전에 표시해야한다는 것을 이해합니다. 특히 "표시된 대화 상자"를 보았 기 때문에.

마지막 순간에 내 대화가 표시되는 이유를 파악하는 데 도움이됩니까? 이 시도

+0

당신이 대화 상자를 만들 때 어떻게됩니까을 이렇게 ('mProgressDialog = 새해서 ProgressDialog (컨텍스트);')'onPreExecute()'또는 귀하의 활동에? – Sam

+0

생성자와 생성자 사이에서 분리하는 대신'onPreExecute'에서'mProgressDialog = ProgressDialog.show (context, ","Performing Query ... ", true);를 사용하면 올바르게 작동합니까? – Geobits

+0

어느 쪽도 일하지 않았다, 나는 그것을 이해하지 않는다. – Geoff

답변

1

당신은 이 당신의 활동에 private ProgressDialog mProgressDialog;

를 만들 ..... doInBackground()

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

나는 이것을 시도하고 똑같은 일을하는 것처럼 보였다. doInBackground()의 시작, 중간 및 끝 부분에 publishProgress()를 배치하고 onProgressUpdate를 오버라이드하여 호출 된 시간의 증가분과 함께 토스트 메시지를 인쇄합니다. 긴 일시 중지 후 나는 세 개의 토스트 메시지가 차례로 하나씩 만 나타나는 것을 보았습니다. 그러나 긴 휴지기 후에 만 ​​다시 나타났습니다. – Geoff

1

에 어떻게 든 publish your progress해야합니다.

onCreate(.....) { 

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

이제 나머지 작업은 비동기 작업에서 수행하는 것과 같습니다. 그냥에서 언급 한 바와 같이 @PearsonArtPhoto

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