2017-04-07 23 views
1

2時間ごとにAPIを更新していますが、
ですが、このエラーが発生し、アプリケーションが終了します。JNI Envを割り当てることができませんでした

FATAL EXCEPTION: main Process: com.application.toweeloasep, PID: 6681 java.lang.OutOfMemoryError: Could not allocate JNI Env at java.lang.Thread.nativeCreate(Native Method) at java.lang.Thread.start(Thread.java:730) at com.android.volley.RequestQueue.start(RequestQueue.java:145) at com.android.volley.toolbox.Volley.newRequestQueue(Volley.java:66) at com.android.volley.toolbox.Volley.newRequestQueue(Volley.java:78) at com.application.toweeloasep.fragments.Jobs$5$1.run(Jobs.java:260) at android.os.Handler.handleCallback(Handler.java:751) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6077) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)

約1分後、クラッシュし始め、そのエラーが発生します。
私はVolleyで物事を圧倒していますか?

private void setRepeatingAsyncTask() { 
     final Handler handler = new Handler(); 
     Timer timer = new Timer(); 
     TimerTask task = new TimerTask() { 
      @Override 
      public void run() { 
       handler.post(new Runnable() { 
        public void run() { 
         try { 
          if (checkRequests) { 
           RequestQueue mRequestQueue = Volley.newRequestQueue(getActivity()); 
           StringRequest mStringRequest = new StringRequest(Request.Method.POST, "http://api.000.com/booking/track", new Response.Listener<String>() { 
            @Override 
            public void onResponse(String response) { 
             Log.e("RESPONSE:TRACK", response); 
             try { 
              JSONObject json = new JSONObject(response); 
              String mStatus = json.getString("status"); 
              if (mStatus.equalsIgnoreCase("0")) { 
               Log.e("STATUS", mStatus); 
              } else if (mStatus.equalsIgnoreCase("1")) { 
               JSONArray infos = json.getJSONArray("data"); 
               booking_id = infos.getJSONObject(0).getString("id"); 
               user_address_location = infos.getJSONObject(0).getString("user_address_location"); 
               mTxtBatteryInfo.setText(infos.getJSONObject(0).getJSONObject("battery").getString("model")); 
               mTxtUserLocation.setText(user_address_location); 
               checkRequests = false; 
               mJobsHome.setVisibility(View.GONE); 
               mJobRequest.setVisibility(View.VISIBLE); 
               if (!onTick) { 
                mCountDownTimer.start(); 
                onTick = true; 
               } 
              } 
             } catch (Exception e) { 
              Log.e("ERR", e.toString()); 
             } 
            } 
           }, new Response.ErrorListener() { 
            @Override 
            public void onErrorResponse(VolleyError error) { 
             Log.e("ERR", error.toString()); 
            } 
           }); 
           mRequestQueue.add(mStringRequest); 
          } else { 
           RequestQueue requestPlaceInfo = Volley.newRequestQueue(getActivity()); 
           StringRequest request2 = new StringRequest(Request.Method.POST, "http://api.000.com/booking/track", new Response.Listener<String>() { 
            @Override 
            public void onResponse(String response) { 
             Log.e("RESPONSE", response); 
            } 
           }, new Response.ErrorListener() { 
            @Override 
            public void onErrorResponse(VolleyError error) { 
             Toast.makeText(getActivity(), error.toString(), Toast.LENGTH_SHORT).show(); 
            } 
           }) { 
            @Override 
            protected Map<String, String> getParams() throws AuthFailureError { 
             Map<String, String> params = new HashMap<>(); 
             params.put("booking_id", booking_id); 
             params.put("rider_long", String.valueOf(lng)); 
             params.put("rider_lat", String.valueOf(lat)); 
             return params; 
            } 
           }; 
           requestPlaceInfo.add(request2); 
          } 
         } catch (Exception e) { 
          // error, do something 
         } 
        } 
       }); 
      } 
     }; 
     timer.schedule(task, 0, 2000); // interval of one minute 
    } 

答えて

1

OutOfMemoryError ... at com.android.volley.toolbox.Volley.newRequestQueue

は、なぜあなたは新しいREQUESTQUEUEまたはStringRequest 2秒ごとに作成する必要がありますか?

それぞれを1つずつ作成してください。

private final Response.ErrorListener errorListener = new Response.ErrorListener() { 
    @Override 
    public void onErrorResponse(VolleyError error) { 
     Log.e("ERR", String.valueOf(error)); 
    } 
}; 

private void setRepeatingVolleyTask() { 
    final RequestQueue mRequestQueue = Volley.newRequestQueue(getActivity()); 

    final StringRequest trackRequest = new StringRequest(Request.Method.POST, "http://api.toweelo.com/booking/track", new Response.Listener<String>() { 
     @Override 
     public void onResponse(String response) { 
      Log.d("RESPONSE:TRACK", response); 
      try { 
       JSONObject json = new JSONObject(response); 
       String mStatus = json.getString("status"); 
       if (mStatus.equalsIgnoreCase("0")) { 
        Log.d("STATUS", mStatus); 
       } else if (mStatus.equalsIgnoreCase("1")) { 
        JSONArray infos = json.getJSONArray("data"); 
        booking_id = infos.getJSONObject(0).getString("id"); 
        user_address_location = infos.getJSONObject(0).getString("user_address_location"); 
        mTxtBatteryInfo.setText(infos.getJSONObject(0).getJSONObject("battery").getString("model")); 
        mTxtUserLocation.setText(user_address_location); 
        checkRequests = false; 
        mJobsHome.setVisibility(View.GONE); 
        mJobRequest.setVisibility(View.VISIBLE); 
        if (!onTick) { 
         mCountDownTimer.start(); 
         onTick = true; 
        } 
       } 
      } catch (Exception e) { 
       Log.e("ERR", e.toString()); 
      } 
     } 
    }, errorListener); 

    final StringRequest trackRequest2 = new StringRequest(Request.Method.POST, "http://api.toweelo.com/booking/track", new Response.Listener<String>() { 
     @Override 
     public void onResponse(String response) { 
      Log.d("RESPONSE", response); 
     } 
    }, errorListener) { 
     @Override 
     protected Map<String, String> getParams() throws AuthFailureError { 
      Map<String, String> params = new HashMap<>(); 
      params.put("booking_id", booking_id); 
      params.put("rider_long", String.valueOf(lng)); 
      params.put("rider_lat", String.valueOf(lat)); 
      return params; 
     } 
    }; 

    Timer timer = new Timer(); 
    TimerTask task = new TimerTask() { 
     @Override 
     public void run() { 
      handler.post(new Runnable() { 
       public void run() { 
        // What are you trying to catch here?? 
        try { 
         if (checkRequests) { 
          mRequestQueue.add(trackRequest); 
         } else { 
          mRequestQueue.add(trackRequest2); 
        } catch (...) { 
         .... 
        } 

注:それは働いていた場合は、このためのJsonObjectRequest代わりのStringRequest

+0

からJSONを解析感謝を使用することができ、私はここに戻って取得します。 THanks –

+0

それは私が思ったように働いた。私はアプリケーションをアイドルと何もappened。 FF質問、文字列リクエストの代わりにJsobjectrquestを使用する利点は何ですか? –

+1

利点は、JSONをリクエストしているので、 'JSONObject json = new JSONObject(response);'を自分で行う必要はありません。また、Volleyのドキュメントを読んだら、Gsonを使って独自のJSONリクエストパーサを作成して、データを自分で解析することなくJavaオブジェクトをすぐに返すことができます。改造は別の選択肢です –

関連する問題