2014-02-25 76 views
2

我试图用齐射做网络请求时显示进度指示器。我收到错误“只有创建视图层次结构的原始线程才能触及其视图”。我无法弄清楚如何让我的hideProgressDialog()与showProgressDialog()相同的线程。这里是我的代码...显示不确定进度指示器

showProgressDialog("Logging you in"); 

    String url = ApplicationController.getInstance().getBaseURL() + "Customer/LoginCustomer"; 

    JsonRequest<String> jr = new JsonRequest<String>(Method.POST, url, jo.toString(), this.createSuccessListener(), 
      this.createErrorListener()) { 

     @Override 
     protected Response<String> parseNetworkResponse(NetworkResponse nr) { 
      hideProgressDialog(); 
      try { 
       String str = new String(nr.data, "UTF-8"); 
      } catch (UnsupportedEncodingException e) { 
       e.printStackTrace(); 
      } 
      return null; 
     } 
    }; 

    ApplicationController.getInstance().addToRequestQueue(jr); 
} 

/** Create Volley Listeners **/ 
private Response.ErrorListener createErrorListener() { 
    return new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 
      hideProgressDialog(); 
     } 
    }; 
} 

private Response.Listener<String> createSuccessListener() { 
    return new Response.Listener<String>() { 
     @Override 
     public void onResponse(String response) { 
      hideProgressDialog();} 
    }; 
} 

解决方案

感谢tautvydas。我最终把这些方法放在我的基类中。

protected void showProgressDialog(String message) { 
    if(mHandler == null){ 
     mHandler = new Handler(); 
    } 
    if (mDialog == null || !mDialog.isShowing()) { 
     mDialog = new ProgressDialog(getActivity()); 
     mDialog.setMessage(message); 
     mDialog.setCancelable(false); 
     mDialog.setIndeterminate(true); 
     mDialog.show(); 
    } 
} 

protected void hideProgressDialog() { 
    if (mDialog != null) { 
     mHandler.post(new Runnable() { 
      @Override 
      // this will run on the main thread. 
      public void run() { 
       mDialog.hide(); 
      } 
     }); 
    } 
} 
+1

参考这个职位各种方式对UI线程上运行: http://stackoverflow.com/questions/12850143/android-basics-running-code-在最UI线程 – Prakash

回答

1

创建Handler,并通过一个Runnable给它的主线程上运行。

1)通过Handler handler = new Handler()onCreate()方法的构造函数中声明Handler。 2)然后在您的parseNetworkResponse()方法调用

handler.post(new Runnable() { 
      @Override 
      // this will run on the main thread. 
      public void run() { 
       hideProgressDialog(); 
      } 
     });