2016-05-11 17 views
0

データベースからJSONObjectを取得しようとしていますが、要求がサーバーに送信されないことがわかりました。これを確認するためにApache Access Logを確認しました。 URLは有効で、Webブラウザ経由でアクセスするとJSONObjectが返されます。例外エラーは、Volleyライブラリによってnullと表示されます。Volleyライブラリがサーバーに接続しない

private void GetSchInfo(){ 

    showDialog(); 

    // making fresh volley request and getting json 
    JsonObjectRequest jsonReq = new JsonObjectRequest(Request.Method.GET, 
      URL_SchInfo, null, new Response.Listener<JSONObject>() { 

     @Override 
     public void onResponse(JSONObject response) { 


      try{ 

       spinnerClass.setVisibility(View.VISIBLE); 
       spinnerSch.setVisibility(View.VISIBLE); 
       spinnerDept.setVisibility(View.VISIBLE); 
       btnRegClass.setVisibility(View.VISIBLE); 
       txtClassMsg.setVisibility(View.VISIBLE); 
       btnRefresh.setVisibility(View.GONE); 

       JSONArray schools = response.getJSONArray("sch_info"); 
       JSONArray departments = response.getJSONArray("dept_info"); 

       for (int i = 0; i < schools.length(); i++){ 
        JSONObject schObj = (JSONObject)schools.get(i); 
        SchInfo sch = new SchInfo(schObj.getString("school_id"), schObj.getString("school_name")); 
        schoolList.add(sch); 
       } 

       for (int j = 0; j < departments.length(); j++){ 
        JSONObject deptObj = (JSONObject)departments.get(j); 
        DeptItem dept = new DeptItem(deptObj.getString("department_id"), deptObj.getString("department_name")); 
        deptList.add(dept); 
       } 


       //populate 
       //populateInfo(); 

      }catch(JSONException e){ 
       Log.e(TAG, "JSON Error: " + e.getMessage()); 
       e.printStackTrace(); 
       spinnerClass.setVisibility(View.GONE); 
       txtClassMsg.setVisibility(View.GONE); 
       spinnerSch.setVisibility(View.GONE); 
       spinnerDept.setVisibility(View.GONE); 
       btnRegClass.setVisibility(View.GONE); 
       btnRefresh.setVisibility(View.VISIBLE); 

      } 

      hideDialog(); 
     } 
    }, new Response.ErrorListener() { 

     @Override 
     public void onErrorResponse(VolleyError error) { 
      String body; 

       if (error.networkResponse.data !=null){ 
       try { 
        body = new String(error.networkResponse.data, "UTF-8"); 
       }catch (UnsupportedEncodingException e){ 
        e.printStackTrace(); 
       } 
      } 

      Log.e("Error: ", error.getCause() +">>" + error.getMessage()); 
      Log.e(TAG, "JSON Error: " + error.getMessage()); 
      hideDialog(); 
      spinnerClass.setVisibility(View.GONE); 
      spinnerSch.setVisibility(View.GONE); 
      spinnerDept.setVisibility(View.GONE); 
      btnRegClass.setVisibility(View.GONE); 
      txtClassMsg.setVisibility(View.GONE); 
      btnRefresh.setVisibility(View.VISIBLE); 
     } 
    }); 

    // Adding request to volley request queue 
    AppController.getInstance().addToRequestQueue(jsonReq); 
} 

どうすれば解決できますか?

サーバは私のローカルマシン上で、私はhttp://192.164.***.***ようなものでホットスポット経由で接続します。

+0

ねえ..あなたはちょうどこのURLを使用して要求を行うことができます。私たちがいるかどうかを確認することができますので、http://developer.android.com/images/training/system-ui.pngを問題はサーバーまたはコードにありますか? – AndiGeeky

+0

@AndiGeeky私はこの 'http:// restcountries.eu/rest/v1'に対してリクエストを行い、サーバに連絡しました。私の電話からサーバーにアクセスできます。 – BlackPearl

+0

ohk。あなたのデモを使ってこのリクエストをしましたか? – AndiGeeky

答えて

1

getMessage()が動作しないことがあります。このコードを試して、サーバーが返す完全なエラーメッセージを取得してください。

if (volleyError != null && volleyError.networkResponse != null) { 
     int statusCode = volleyError.networkResponse.statusCode; 
     Log.w(tagToUse, TAG + " response code:" + statusCode + ""); 
     byte[] data = volleyError.networkResponse.data; 
     int length = data.length; 
     StringBuilder stringBuilder = new StringBuilder(length); 
     for (int x = 0; x < length; x++) { 
      stringBuilder.append(((char) data[x])); 
     } 
     String errorMessage = stringBuilder.toString(); 
     Log.d(tagToUse, TAG + " Server error data: " + errorMessage); 
    } 
2

これが完璧にうまくいく場合は、アンドロイドモバイルのブラウザからリクエストを行い、ボレーの問題でなければなりません。 それはあなただけで192.168を入力して、サーバーに接続することはできません.... また、このリンクをチェックして、エミュレータ内でアプリケーションを実行することを意味し、その後動作しなかった場合: How to connect to my http://localhost web server from Android Emulator in Eclipse

ので、すべての手段によって、使用したい場合あなたのサーバーをオンラインにするようなものです。グローバルIPを使用してサーバーにpingを実行します。 自分のサーバーのドキュメントに従ってローカルサーバーをオンラインにする方法を読んでください。

+0

アンドロイドブラウザでのテストの手がかりとして、どこから問題が発生しているのかがわかりました。 – BlackPearl

+0

私は私のプロジェクトを開発していたときと同じ問題を抱えていました。私はWampサーバーをオンラインモードにしました。彼のhttp doc inorderとtwikkedして、すべての要求に完全にアクセスし、ファイアウォールに例外を追加しました。グローバルIPを使用します。 また、サーバーが他のローカルIPからの要求を受け入れることを確認します。 –

1

私の戦略は、バレーシングルトンを作り、どこからでも使うことです。ここ は手順です: は

menifestのインターネット権限を追加し、あなたの menifest.xml

<application 
     android:name=".package_path.YourApplication"> 

で怒鳴るのコードを追加します。この

public class YourApplication extends Application { 

    public static final String TAG = YourApplication.class.getSimpleName(); 
    private RequestQueue requestQueue; 
    private com.android.volley.toolbox.ImageLoader imageLoader; 
    private static YourApplication instace; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     instace = this; 
    } 

    public static synchronized YourApplication getInstance() { 
     return instace; 
    } 

    public RequestQueue getRequestQueue() { 
     if (requestQueue == null) { 
      requestQueue = Volley.newRequestQueue(getApplicationContext()); 
     } 

     return requestQueue; 
    } 

    public <T> void addToRequestQueue(Request<T> req, String tag) { 
     // set the default tag if tag is empty 
     req.setTag(TextUtils.isEmpty(tag) ? TAG : tag); 
     getRequestQueue().add(req); 
    } 

    public <T> void addToRequestQueue(Request<T> req) { 
     req.setTag(TAG); 
     getRequestQueue().add(req); 
    } 

    public void cancelPendingRequests(Object tag) { 
     if (requestQueue != null) { 
      requestQueue.cancelAll(tag); 
     } 
    } 
} 

のようなアプリケーションクラスを作成しますbuild.gradleファイルに

compile 'com.mcxiaoke.volley:library-aar:1.0.0' 

をこのGradleのを追加します

<uses-permission android:name="android.permission.INTERNET" /> 

あなたのボレーが設定されました。 build.gradleファイル内

final ProgressDialog progressDialog = new ProgressDialog(this, ProgressDialog.THEME_HOLO_LIGHT); 
     progressDialog.setMessage("Please wait..."); 
     progressDialog.setCancelable(false); 
     progressDialog.show(); 

     JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, 
       URL_HERE, 
       null, 
       new Response.Listener<JSONObject>() { 

        @Override 
        public void onResponse(JSONObject object) { 
         progressDialog.dismiss(); 
      // Your Data is here 
       }, new Response.ErrorListener() { 

      @Override 
      public void onErrorResponse(VolleyError error) { 
       progressDialog.dismiss(); 
     //Error Occured 


      } 
     }); 
     jsonObjectRequest.setRetryPolicy(new DefaultRetryPolicy(30000, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT)); 
     YourApplication.getInstance().addToRequestQueue(jsonObjectRequest, "YOUR_TAG"); 

編集 使用compile 'com.android.volley:volley:1.0.0'':あなたはそれをこのように使用します。それは:)だ

compile 'com.mcxiaoke.volley:library-aar:1.0.0' is just deprecated. 

+0

ありがとう、これは既に使用していました。 – BlackPearl

+0

それはあなたの問題を解決できますか? –

+0

そのgradleコンパイルは[非推奨](https://github.com/mcxiaoke/android-volley) –

関連する問題