私はこれを理解できないようです。私はAndroidを初めて使用し、Webサイトからデータベースをクエリしているときにダイアログを表示しようとしています。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
...(長い一時停止)が終わるまでダイアログが表示されず、ほんの一瞬しか表示されません。一時停止後の行は非常に速く発生します。ダイアログが正確にどこから表示されるかはわかりませんが、特に「表示されたダイアログ」のログが表示されるため、長い一時停止の前に表示されるはずです。
誰かが私のダイアログが最後の最後に表示される理由を理解するのを手伝ってもらえますか?