2013-06-20 76 views
1

我的应用程序需要很多与服务器的通信。一些电话需要很长时间,所以我需要显示progressdialogs。 Befor,我把:如何汇总progressdialog?

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; 

    } 
} 

不幸的是它gaves我的错误。据我了解,我应该在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):at java.util.concurrent.FutureTask $ Sync.innerGet(FutureTask.java:223) 06-20 13 :46/01.377:W/System.err(1244):at java.util.concurrent.FutureTask.get(FutureTask.java:82)06-20 13:46:01.377:W/System.err(1244) :at android.os.AsyncTask.get(AsyncTask.java:482)06-20 13:46:01.377: W/System.err(1244):at ua.mirkvartir.android.frontend.LoginActivity $ 2.onClick(LoginActivity.java:108) 06-20 13:46:01.377:W/System.err(1244):at android.view.View.performClick(View .java:4084)06-20 13:46:01.377: W/System.err(1244):at android.view.View $ PerformClick.run(View.java:16966)06-20 13:46: 01.387:W/System.err(1244):at android.os.Handler.handleCallback(Handler.java:615)06-20 13:46:01.387:W/System.err(1244):at android。 os.Handler.dispatchMessage(Handler.java:92)06-20 13:46:01.387:W/System.err(1244):at android.os.Looper.loop(Looper.java:137)06-20 13:46:01.387: W/System.err(1244):at android.app。 ActivityThread.main(ActivityThread.java:4745)06-20 13:46:01.397:W/System.err(1244):at java.lang.reflect.Method.invokeNative(Native Method)06-20 13: System.err(1244):46/01.397:W/System.err(1244):at java.lang.reflect.Method.invoke(Method.java:511)06-20 13:46:01.397: :在 com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:786) 06-20 13:46:01.397:W/System.err(1244):at com.android.internal.os .ZygoteInit.main(ZygoteInit.java:553)06-20 13:46:01.407:W/System.err(1244):at dalvik.system.NativeStart.main(Native Method)06-20 13:46: 01.407: W/System.err(1244):引起:java.lang.RuntimeException:不能 在未调用Looper.prepare()的线程中创建处理程序 06-20 13:46:01.418:W/System.err(1244):at android.os.Handler。(Handler.java:121)06- 20 13:46:01.418: W/System.err(1244):at android.app.Dialog。(Dialog.java:107) 06-20 13:46:01.418:W/System.err(1244): at android.app.AlertDialog。(AlertDialog.java:114)06-20 13:46:01.427:W/System.err(1244):at android.app.AlertDialog。(AlertDialog.java:98)06 -20 13:46:01.427:W/System.err(1244):at android.app.ProgressDialog。(ProgressDialog。java:77)06-20 13:46:01.427:W/System.err(1244):at ua.mirkvartir.android.frontend.adapter.JSONParser.getJSONFromUrl(JSONParser.java:79) 06-20 13 :46:01.437:W/System.err(1244):at ua.mirkvartir.android.frontend.UserFunctions.loginUser(UserFunctions.java:64) 06-20 13:46:01.437:W/System.err( 1244):at ua.mirkvartir.android.frontend.LoginActivity $ Login.doInBackground(LoginActivity.java:280) 06-20 13:46:01.437:W/System.err(1244):at ua.mirkvartir。 android.frontend.LoginActivity $ Login.doInBackground(LoginActivity.java:1) 06-20 13:46:01.447:W/System.err(1244):at android.os.AsyncTask $ 2.call(AsyncTask.java: 287)06-20 13:46:01.447: W/System.err(1 244):at java.util.concurrent.FutureTask $ Sync.innerRun(FutureTask.java:305) 06-20 13:46:01.447:W/System.err(1244):at java.util.concurrent。 FutureTask.run(FutureTask.java:137)06-20 13:46:01.457:W/System.err(1244):at android.os.AsyncTask $ SerialExecutor $ 1.run(AsyncTask.java:230)06- 20 13:46:01.457:W/System.err(1244):at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 06-20 13:46:01.457:W/System.err (1244):at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:569) 06-20 13:46:01.457:W/System.err(1244):at java.lang.Thread .run(Thread.java:856)06-20 13:46:01.457:D /得到 响应(1244):真06-20 13:46:01.467:完成D /工作(1244):真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):at android.os.AsyncTask $ 3.done(AsyncTask.java:299)06-20 13 :46/01.517: E/AndroidRuntime(1244):at 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):at java.util.concurrent.FutureTask $ Sync.innerRun(FutureTask。 java:307) 06-20 13:46:01.517:E/AndroidRuntime(1244):at java.util.concurrent.FutureTask.run(FutureTask.java:137)06-20 13:46:01.517:E/AndroidRuntime(1244):at android.os.AsyncTask $ SerialExecutor $ 1.run(AsyncTask.java:230)06-20 13:46:01.517:E/AndroidRuntime(1244):at java.util.concurrent。 ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 06-20 13:46:01.517:E/AndroidRuntime(1244):at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:569)E/AndroidRuntime(1244):06-20 13:46:01.517:E/AndroidRuntime(1244):at java.lang.Thread.run(Thread.java:856)06-20 13:46:01.517: 导致:java.lang.RuntimeException:不能 在未调用Looper.prepare()的线程内创建处理程序() 06-20 13:46:01.517:E/AndroidRuntime(1244):at android.os.Handler 。(Handler.java:121)06-20 13:46:01.517: E/AndroidRuntime(1244):at android.app.Dialog。(Dialog.java:107) 06-20 13:46:01.517:E/AndroidRuntime(1244):at android.app.AlertDialog。(AlertDialog.java:114)06-20 13:46:01.517:E/AndroidRuntime(1244):at android.app.AlertDialog。(AlertDialog.java :98)06-20 13:46:01。517:E/AndroidRuntime(1244):at android.app.ProgressDialog。(ProgressDialog.java:77)06-20 13:46:01.517:E/AndroidRuntime(1244):at ua.mirkvartir.android.frontend .adapter.JSONParser.getJSONFromUrl(JSONParser.java:79) 06-20 13:46:01.517:E/AndroidRuntime(1244):at ua.mirkvartir.android.frontend.UserFunctions.loginUser(UserFunctions.java:64) 06-20 13:46:01.517:E/AndroidRuntime(1244):at ua.mirkvartir.android.frontend.LoginActivity $ Login.doInBackground(LoginActivity.java:280) 06-20 13:46:01.517:E/AndroidRuntime(1244):at ua.mirkvartir.android.frontend.LoginActivity $ Login.doInBackground(LoginActivity.java:1) 06-20 13:46:01.517:E/AndroidRuntime(1244):at android.os.AsyncTask $ 2.call(AsyncTask.java:287)06-20 13:46:01.517: E/AndroidRuntime(1244):at 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没有实现

所以我想知道显示进度对话框的方式,无论我需要它,它都会弹出。当getJsonFromUrl被调用时我可以显示它,当getJsonFromUrl返回时可以解除它吗?

+0

如果有帮助,不要忘记打勾 – amalBit

回答

1

创建一个类:(只是一个模型代码..)

class Dialog{ 
public void showDialog(){ 
     pd = new ProgressDialog(app); 
     pd.setOwnerActivity(app); 
     pd.setTitle("Идет загрузка..."); 
     pd.setCancelable(true); 
     pd.show(); 
} 
public void dismissDialog(){ 
     pd.dismiss(); 
} 
} 

现在访问throught您的应用程序,whenevr u需要的对话框。

+0

我应该添加什么?因为我看到没有区别 – Yarh

+0

我不理解你 – amalBit