私のアプリケーションは、サーバーとの多くの通信を必要とします。一部の呼び出しには時間がかかるため、progressdialogs を表示する必要があります。前に、私は入れました:
ProgressDialog pd;
@Override
protected void onPreExecute() {
pd = new ProgressDialog(app);
pd.setOwnerActivity(app);
pd.setTitle("Идет загрузка...");
pd.setCancelable(true);
pd.show();
}
protected void onPostExecute(JSONObject result) {
super.onPostExecute(result);
pd.dismiss();
//some code
}
asynctask を拡張した各クラスに。ただし、今は asynctask クラスで .get() を使用する必要があるため、progressdialog はタスクが実行されたときにのみ点滅します。
その後、asynctask クラスから progressdialog 呼び出しを削除して、JsonParser に配置しようとしました。
public class JSONParser {
static InputStream is = null;
static JSONObject jObj = null;
static JSONArray jObj1 = null;
static String json = "";
DefaultHttpClient httpClient = null;
static Context context;
ProgressDialog pd;
// constructor
public JSONParser() {
}
private static Boolean isOnline() {
context = UILApplication.getAppContext();
Log.d("CONTEXT",context.toString());
ConnectivityManager connectivity = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
if (connectivity != null) {
NetworkInfo[] info = connectivity.getAllNetworkInfo();
if (info != null) {
for (int i = 0; i < info.length; i++) {
if (info[i].getState() == NetworkInfo.State.CONNECTED) {
Log.d("Conected", "Conected");
return true;
}
}
}
}
Log.d("disconected", "disconected");
return false;
}
public JSONObject getJSONFromUrl(String url, List<NameValuePair> params) {
if (isOnline()) {
pd = new ProgressDialog(context);
//pd.setOwnerActivity(context);
pd.setTitle("Идет загрузка...");
pd.setCancelable(true);
pd.show();
try {
String u = url;
u = u + "?";
httpClient = HttpClientFactory.getThreadSafeClient();
HttpPost httpPost = new HttpPost(url);
httpPost.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
for (int i = 0; i < params.size(); i++) {
u = u + params.get(i).getName() + "="
+ params.get(i).getValue() + "&";
}
Log.d("your url is", u);
HttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();
is = httpEntity.getContent();
Log.d("data is sent", "true");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
return null;
} catch (ClientProtocolException e) {
e.printStackTrace();
return null;
} catch (IOException e) {
e.printStackTrace();
return null;
}
Log.d("wait", "true");
try {
BufferedReader reader = new BufferedReader(
new InputStreamReader(is, "UTF-8"), 8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
is.close();
json = sb.toString();
if (json.contains("error:2")) {
return null;
}
Log.d("JSON", json);
} catch (Exception e) {
Log.e("Buffer Error", "Error converting result " + e.toString());
return null;
}
// try parse the string to a JSON object
try {
jObj = new JSONObject(json);
} catch (JSONException e) {
Log.e("JSON Parser", "Error parsing data " + e.toString());
return null;
}
pd.dismiss();
return jObj;
}
pd.dismiss();
error();
return null;
}
}
残念ながら、それは私にエラーを与えました。私が理解しているように、UIthread でダイアログを呼び出す必要があります。
06-20 13:46:01.368: W/System.err(1244): java.util.concurrent.ExecutionException: java.lang.RuntimeException: Looper.prepare() を呼び出していないスレッド内でハンドラーを作成できません 06- 20 13:46:01.368: W/System.err(1244): java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:223) 06-20 13:46:01.377: W/System.err( 1244): java.util.concurrent.FutureTask.get(FutureTask.java:82) 06-20 13:46:01.377: W/System.err(1244): android.os.AsyncTask.get(AsyncTask.java) :482) 06-20 13:46:01.377: W/System.err(1244): ua.mirkvartir.android.frontend.LoginActivity$2.onClick(LoginActivity.java:108) 06-20 13:46:01.377: W/System.err(1244): Android.view.View.performClick(View.java:4084) 06-20 13:46:01.377: W/System.err(1244): Android.view.View$PerformClick で実行 (View.java:16966) 06-20 13:46:01.387:W/System.err(1244): android.os.Handler.handleCallback(Handler.java:615) 06-20 13:46:01.387: W/System.err(1244): android.os.Handler.dispatchMessage (Handler.java:92) 06-20 13:46:01.387: W/System.err(1244): android.os.Looper.loop(Looper.java:137) 06-20 13:46:01.387: W /System.err(1244): android.app.ActivityThread.main(ActivityThread.java:4745) 06-20 13:46:01.397: W/System.err(1244): java.lang.reflect.Method で。 invokeNative(ネイティブ メソッド) 06-20 13:46:01.397: W/System.err(1244): java.lang.reflect.Method.invoke(Method.java:511) 06-20 13:46:01.397: W /System.err(1244): com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 06-20 13:46:01.397: W/System.err(1244): com. android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 06-20 13:46:01.407: W/システム。err(1244): dalvik.system.NativeStart.main(Native Method) 06-20 13:46:01.407: W/System.err(1244): 原因: java.lang.RuntimeException: Can't create handler inside Looper.prepare() 06-20 13:46:01.418 を呼び出していないスレッド: W/System.err(1244): android.os.Handler.(Handler.java:121) 06-20 13:46:01.418 で: W/System.err(1244): android.app.Dialog.(Dialog.java:107) 06-20 13:46:01.418: W/System.err(1244): android.app.AlertDialog.( AlertDialog.java:114) 06-20 13:46:01.427: W/System.err(1244): android.app.AlertDialog.(AlertDialog.java:98) 06-20 13:46:01.427: W/システム.err(1244): android.app.ProgressDialog.(ProgressDialog.java:77) 06-20 13:46:01.427: W/System.err(1244): ua.mirkvartir.android.frontend.adapter.JSONParser で.getJSONFromUrl(JSONParser.java:79) 06-20 13:46:01.437: W/システム。err(1244): ua.mirkvartir.android.frontend.UserFunctions.loginUser(UserFunctions.java:64) 06-20 13:46:01.437: W/System.err(1244): ua.mirkvartir.android.frontend で.LoginActivity$Login.doInBackground(LoginActivity.java:280) 06-20 13:46:01.437: W/System.err(1244): ua.mirkvartir.android.frontend.LoginActivity$Login.doInBackground(LoginActivity.java: 1) 06-20 13:46:01.447: W/System.err(1244): android.os.AsyncTask$2.call(AsyncTask.java:287) で 06-20 13:46:01.447: W/System.err (1244): java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 06-20 13:46:01.447: W/System.err(1244): java.util.concurrent.FutureTask で。実行 (FutureTask.java:137) 06-20 13:46:01.457: W/System.err(1244): android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 06-20 13:46 :01.457: W/System.err(1244): Java で。util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 06-20 13:46:01.457: W/System.err(1244): java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569 で) 06-20 13:46:01.457: W/System.err(1244): java.lang.Thread.run(Thread.java:856) 06-20 13:46:01.457: D/getting response(1244) : true 06-20 13:46:01.467: D/work done(1244): true 06-20 13:46:01.477: W/dalvikvm(1244): threadid=11: キャッチされない例外で終了するスレッド (group=0x40a13300) 06-20 13:46:01.517: E/AndroidRuntime(1244): 致命的な例外: AsyncTask #1 06-20 13:46:01.517: E/AndroidRuntime(1244): java.lang.RuntimeException: doInBackground の実行中にエラーが発生しました() 06-20 13:46:01.517: E/AndroidRuntime(1244): android.os.AsyncTask$3.done(AsyncTask.java:299) 06-20 13:46:01.517: E/AndroidRuntime(1244):java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 06-20 13:46:01.517: E/AndroidRuntime(1244): java.util.concurrent.FutureTask.setException(FutureTask.java: 124) 06-20 13:46:01.517: E/AndroidRuntime(1244): java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 06-20 13:46:01.517: E/AndroidRuntime( 1244): java.util.concurrent.FutureTask.run(FutureTask.java:137) 06-20 13:46:01.517: E/AndroidRuntime(1244): android.os.AsyncTask$SerialExecutor$1.run(AsyncTask. java:230) 06-20 13:46:01.517: E/AndroidRuntime(1244): java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 06-20 13:46:01.517: E/AndroidRuntime( 1244): java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 06-20 13:46:01.517 で:E/AndroidRuntime(1244): java.lang.Thread.run(Thread.java:856) 06-20 13:46:01.517: E/AndroidRuntime(1244): 原因: java.lang.RuntimeException: できませんLooper.prepare() 06-20 13:46:01.517: E/AndroidRuntime(1244): android.os.Handler.(Handler.java:121) 06-20 13:46: を呼び出していないスレッド内にハンドラを作成します。 01.517: E/AndroidRuntime(1244): android.app.Dialog.(Dialog.java:107) 06-20 13:46:01.517: E/AndroidRuntime(1244): android.app.AlertDialog.(AlertDialog.java) :114) 06-20 13:46:01.517: E/AndroidRuntime(1244): android.app.AlertDialog.(AlertDialog.java:98) 06-20 13:46:01.517: E/AndroidRuntime(1244): でandroid.app.ProgressDialog.(ProgressDialog.java:77) 06-20 13:46:01.517: E/AndroidRuntime(1244): ua.mirkvartir.android.frontend.adapter.JSONParser.getJSONFromUrl(JSONParser.java:79) 06-20 13:46:01.517: E/AndroidRuntime(1244): ua.mirkvartir.android.frontend.UserFunctions.loginUser(UserFunctions.java:64) 06-20 13:46:01.517: E/AndroidRuntime( 1244): ua.mirkvartir.android.frontend.LoginActivity$Login.doInBackground(LoginActivity.java:280) 06-20 13:46:01.517: E/AndroidRuntime(1244): ua.mirkvartir.android.frontend.LoginActivity で$Login.doInBackground(LoginActivity.java:1) 06-20 13:46:01.517: E/AndroidRuntime(1244): android.os.AsyncTask$2.call(AsyncTask.java:287) 06-20 13:46: 01.517: E/AndroidRuntime(1244): java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 06-20 13:46:01.517: E/AndroidRuntime(1244): ... 5 more 06 -20 13:46:01.857: W/EGL_emulation (1244): eglSurfaceAttrib が実装されていませんUserFunctions.loginUser(UserFunctions.java:64) 06-20 13:46:01.517: E/AndroidRuntime(1244): ua.mirkvartir.android.frontend.LoginActivity$Login.doInBackground(LoginActivity.java:280) 06-20 13:46:01.517: E/AndroidRuntime(1244): ua.mirkvartir.android.frontend.LoginActivity$Login.doInBackground(LoginActivity.java:1) 06-20 13:46:01.517: E/AndroidRuntime(1244): android.os.AsyncTask$2.call(AsyncTask.java:287) 06-20 13:46:01.517: E/AndroidRuntime(1244): java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) ) 06-20 13:46:01.517: E/AndroidRuntime(1244): ... 5 06-20 13:46:01.857: W/EGL_emulation(1244): eglSurfaceAttrib が実装されていませんUserFunctions.loginUser(UserFunctions.java:64) 06-20 13:46:01.517: E/AndroidRuntime(1244): ua.mirkvartir.android.frontend.LoginActivity$Login.doInBackground(LoginActivity.java:280) 06-20 13:46:01.517: E/AndroidRuntime(1244): ua.mirkvartir.android.frontend.LoginActivity$Login.doInBackground(LoginActivity.java:1) 06-20 13:46:01.517: E/AndroidRuntime(1244): android.os.AsyncTask$2.call(AsyncTask.java:287) 06-20 13:46:01.517: E/AndroidRuntime(1244): java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) ) 06-20 13:46:01.517: E/AndroidRuntime(1244): ... 5 06-20 13:46:01.857: W/EGL_emulation(1244): eglSurfaceAttrib が実装されていませんdoInBackground(LoginActivity.java:280) 06-20 13:46:01.517: E/AndroidRuntime(1244): ua.mirkvartir.android.frontend.LoginActivity$Login.doInBackground(LoginActivity.java:1) 06-20 13: 46:01.517: E/AndroidRuntime(1244): android.os.AsyncTask$2.call(AsyncTask.java:287) 06-20 13:46:01.517: E/AndroidRuntime(1244): java.util.concurrent で。 FutureTask$Sync.innerRun(FutureTask.java:305) 06-20 13:46:01.517: E/AndroidRuntime(1244): ... 5 06-20 13:46:01.857: W/EGL_emulation(1244): eglSurfaceAttrib未実装doInBackground(LoginActivity.java:280) 06-20 13:46:01.517: E/AndroidRuntime(1244): ua.mirkvartir.android.frontend.LoginActivity$Login.doInBackground(LoginActivity.java:1) 06-20 13: 46:01.517: E/AndroidRuntime(1244): android.os.AsyncTask$2.call(AsyncTask.java:287) 06-20 13:46:01.517: E/AndroidRuntime(1244): java.util.concurrent で。 FutureTask$Sync.innerRun(FutureTask.java:305) 06-20 13:46:01.517: E/AndroidRuntime(1244): ... 5 06-20 13:46:01.857: W/EGL_emulation(1244): eglSurfaceAttrib未実装concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 06-20 13:46:01.517: E/AndroidRuntime(1244): ... 5 06-20 13:46:01.857: W/EGL_emulation(1244) : eglSurfaceAttrib が実装されていませんconcurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 06-20 13:46:01.517: E/AndroidRuntime(1244): ... 5 06-20 13:46:01.857: W/EGL_emulation(1244) : eglSurfaceAttrib が実装されていません
そのため、必要な場所にポップアップする進行状況ダイアログを表示する方法を知りたいです。getJsonFromUrl が呼び出されたときに表示し、getJsonFromUrl が返されたときに閉じることはできますか?