2017-12-11 1 views
0

가 나는 그래서 동일한을 추가 한 매 5 분마다 10 ~ 100 레코드를 얻을 것이다 그래서 여기에 SQLite는안드로이드 JSON 배열이

에서

를 JSON 데이터 저장을 얻기 위해 This을 따라 빈 때 루프에서 JSON 데이터 실패 가져 오기 서비스와 그 서비스에 대한 기능은 이제 문제는 15 ~ 20과 같은 몇 가지 기록이이 모든 5 반복이 오류 java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.length()' on a null object reference

을 보여주는 후에 그것은 .. 일부 기록에 대한 데이터를 얻을 것이다 때마다 5 분 그래서 여기

에게 반복 분 예를 들어 그 atleast 5 시간에 30 레코드를 받고 오전이 오류 ...,

이 때문에 나는

어떻게이 오류로 얻을 수 ... 여기에 내가 그 사라 누락 어떤 서버에서 30 개 기록을 얻을 수 아니다 인해 .. 그 기록 데이터를 잃어버린하고

이 내 서비스 클래스이다 .....

public class ServMain2 extends Service { 

    public static final String MyShredPrefs = "MyShredPrefs_data"; 

    Context mContext = this; 

    SQLiteDatabase sqLiteDatabase; 
    String HttpJSonURL; 

    @Override 
    public IBinder onBind(Intent intent) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     super.onStartCommand(intent, flags, startId); 
     HttpJSonURL = intent.getExtras().getString("mystrdata"); 

     return START_STICKY; 
    } 

    @Override 
    public void onCreate() { 

     SharedPreferences s = getSharedPreferences(MyShredPrefs, 0); 
     HashMap<String, String> map= (HashMap<String, String>) s.getAll(); 

     //ti= Integer.parseInt(map.get("time_int")); 
     ti=3000; 

     try{ 
      SQLiteDataBaseBuild(); 
      SQLiteTableBuild(); 

      new StoreJSonDataInToSQLiteClass(ServMain2.this).execute(); 
     } 
     catch(Exception e){ 
      Toast.makeText(getApplicationContext(), "Reconnecting to Server", Toast.LENGTH_LONG).show(); 
     } 

    } 

    private class StoreJSonDataInToSQLiteClass extends AsyncTask<Void, Void, Void> { //line No :65 

     public Context context; 
     String FinalJSonResult; 

     public StoreJSonDataInToSQLiteClass(Context context) { 
      this.context = context; 
     } 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 

     } 

     @Override 
     protected Void doInBackground(Void... arg0) { 

      HttpServiceClass httpServiceClass = new HttpServiceClass(HttpJSonURL); 

      try { 
       httpServiceClass.ExecutePostRequest();     //line No :87 
       if (httpServiceClass.getResponseCode() == 200) { 
        FinalJSonResult = httpServiceClass.getResponse(); 
        if (FinalJSonResult != null) { 

         try { 
          JSONObject JObject = new JSONObject(FinalJSonResult); 
          JSONArray response =JObject.getJSONArray("response"); 
          for(int i = 0 ; i < response.length(); i++) { 
           JSONObject res = response.getJSONObject(i); 
           String usr_id=res.getString("usr_id"); 
           String phn_no=res.getString("phn_no"); 
           String usr_name=res.getString("usr_name"); 

           String usr_status= "NEW"; 

           String SQLiteDataBaseQueryHolder = "INSERT INTO "+ SQLiteHelper.TABLE_NAME+" (usr_id,phn_no,usr_name,usr_status) VALUES('"+usr_id+"','"+phn_no+"','"+usr_name+"','"+usr_status+"');"; 

           sqLiteDatabase.execSQL(SQLiteDataBaseQueryHolder); 

          } 
         } 
         catch (JSONException e) { 
          // TODO Auto-generated catch block 
          e.printStackTrace(); 
         } 
        } 
       } 
       else { 
        Toast.makeText(context, httpServiceClass.getErrorMessage(), Toast.LENGTH_SHORT).show(); 
       } 
      } 
      catch (Exception e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
      return null; 
     } 
     @Override 
     protected void onPostExecute(Void result) 
     { 
      sqLiteDatabase.close(); 
      //progressDialog.dismiss(); 
      Toast.makeText(ServMain2.this,"Load Done", Toast.LENGTH_LONG).show(); 
     } 
    } 

    public void SQLiteDataBaseBuild(){ 
     sqLiteDatabase = openOrCreateDatabase(SQLiteHelper.DATABASE_NAME, Context.MODE_PRIVATE, null); 
    } 

    public void SQLiteTableBuild(){ 

     sqLiteDatabase.execSQL("CREATE TABLE IF NOT EXISTS "+SQLiteHelper.TABLE_NAME+" ("+SQLiteHelper.T_USR_NO+" INTEGER PRIMARY KEY AUTOINCREMENT ,"+SQLiteHelper.T_USR_ID+" INTEGER(6),"+SQLiteHelper.T_PHN_NO+" VARCHAR2(15) , "+SQLiteHelper.T_USR_NAME+" TEXT, "+SQLiteHelper.T_USR_STATUS+" VARCHAR2(15) NOT NULL)"); 

    } 

    public void DeletePreviousData(){ 
     sqLiteDatabase.execSQL("DELETE FROM "+SQLiteHelper.TABLE_NAME+""); 
    } 

} 

업데이트

난 ... 단지 몇 시간 동안 N을 오류가 발생하고 오, 항상 10 레코드에서 ..이 오류로 인해 나는 2 레코드가 누락되었습니다 ...이 오류가 작동하기 전에 오류가 발생하기 전에 작동합니다.

10 회 실행시에만 2 또는 3의 URL을 읽지 못했습니다. 시간 나는 내 코드에서 ... 줄 번호를 추가 한

AsyncTask #1 calls detatch() 
I/System.out: @@@@@@@http://www......myservie/api_.......this is my live url$$$$$$$AsyncTask #2 calls detatch() 
@@@@@@@http://www......myservie/api_.......this is my live url$$$$$$$AsyncTask #3 calls detatch() 
@@@@@@@http://www......myservie/api_.......this is my live url$$$$$$$AsyncTask #4 calls detatch() 
@@@@@@@http://www......myservie/api_.......this is my live url$$$$$$$AsyncTask #5 calls detatch() 
java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.length()' on a null object reference 
at java.net.URI.parseURI(URI.java:353) 
at java.net.URI.<init>(URI.java:204) 
at java.net.URI.create(URI.java:728) 
at org.apache.http.client.methods.HttpPost.<init>(HttpPost.java:79) 
at my.api.service.HttpServiceClass.ExecutePostRequest(HttpServiceClass.java:85) 
at my.api.service.ServMain2$StoreJSonDataInToSQLiteClass.doInBackground(ServMain2.java:87) 
at my.api.service.ServMain2$StoreJSonDataInToSQLiteClass.doInBackground(ServMain2.java:65) 
at android.os.AsyncTask$2.call(AsyncTask.java:288) 
at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
at java.lang.Thread.run(Thread.java:818) 
java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.length()' on a null object reference 
at java.net.URI.parseURI(URI.java:353) 
at java.net.URI.<init>(URI.java:204) 
at java.net.URI.create(URI.java:728) 
at org.apache.http.client.methods.HttpPost.<init>(HttpPost.java:79) 
at my.api.service.HttpServiceClass.ExecutePostRequest(HttpServiceClass.java:85) 
at my.api.service.ServMain2$StoreJSonDataInToSQLiteClass.doInBackground(ServMain2.java:87) 
at my.api.service.ServMain2$StoreJSonDataInToSQLiteClass.doInBackground(ServMain2.java:65) 
at android.os.AsyncTask$2.call(AsyncTask.java:288) 
at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
at java.lang.Thread.run(Thread.java:818) 
@@@@@@@[email protected]@@@@@@[email protected]@@@@@@http://www......myservie/api_.......this is my live url$$$$$$$AsyncTask #3 calls detatch() 
@@@@@@@http://www......myservie/api_.......this is my live url$$$$$$$AsyncTask #4 calls detatch() 
@@@@@@@http://www......myservie/api_.......this is my live url$$$$$$$AsyncTask #5 calls detatch() 

다시 그 wokring이 내 로그 캣입니다 좋은 ... 같은 // 라인 번호 : 65

업데이트 1

내 로그 내가 분명히 해당 URL을 말할 수 보아서 16,

때문에 그가 null보기 몇 번 및 일부 배 로딩 URL 및 일부 시간 오류로 인해 널 URL에 몇 번

@@@@@@@[email protected]@@@@@@[email protected]@@@@@@http://www......myservie/api_.......this is my live url$$$$$$$AsyncTask #3 calls detatch() 
@@@@@@@http://www......myservie/api_.......this is my live url$$$$$$$AsyncTask #4 calls detatch() 
@@@@@@@http://www......myservie/api_.......this is my live url$$$$$$$AsyncTask #5 calls detatch() 

누락

수있는 하나는이 종류에 저를 추천 ..이 같은 URL을하기 만하면 나는 URL이 다른 서비스

업데이트 2

를 형성 얻고 있기 때문에 내 JSON 데이터 서버에서 35,846,510,403,210 시간이 좀 빈 JSON 배열

그것은해야 보냅니다

{ 
"response": [ 
{ 
"usr_id": "1", 
"phn_no": "1234567890", 
"usr_name": "Demo" 
}, 
{ 
"usr_id": "2", 
"phn_no": "1234567890", 
"usr_name": "Demo" 
}, 
{ 
"usr_id": "3", 
"phn_no": "1234567890", 
"usr_name": "Demo" 
} 
] 
} 

그러나 언젠가는 내가 날씨를 확인하기 위해 if(response!= null && response .length()>0) {을 추가 한

{ 
"response": [] 
} 

처럼 빈 JSON 배열을 얻고있다 그것의 빈 또는 아닙니다 ..하지만 여전히 같은 문제 ..심지어 나는 그대로 어떤 일이 ... 어떻게 이런 종류의에 그 빈 문자열을 처리 할

답변

0

사용이 코드를 저를 제안 할 수 있습니다 ..

catch (NullPointerException x) { 
// TODO Auto-generated catch block 
x.printStackTrace(); 
} 

하지만 여전히 해결되지

을 추가했습니다. 나는 문제가 응답 변수가 빈 시도 확인이 좋아입니다 생각 :

try { 
     JSONObject JObject = new JSONObject(FinalJSonResult); 
     JSONArray response =JObject.getJSONArray("response"); 
     try { 
      if (response != null && response.length() > 0) { 
       for (int i = 0; i < response.length(); i++) { 
        JSONObject res = response.getJSONObject(i); 
        String usr_id = res.getString("usr_id"); 
        String phn_no = res.getString("phn_no"); 
        String usr_name = res.getString("usr_name"); 

        String usr_status = "NEW"; 

        String SQLiteDataBaseQueryHolder = "INSERT INTO " + SQLiteHelper.TABLE_NAME + " (usr_id,phn_no,usr_name,usr_status) VALUES('" + usr_id + "','" + phn_no + "','" + usr_name + "','" + usr_status + "');"; 

        sqLiteDatabase.execSQL(SQLiteDataBaseQueryHolder); 
       } 
      } 
     }catch (NullPointerException x) { 
       // TODO Auto-generated catch block 
       x.printStackTrace(); 
      } 
    } 
    catch (JSONException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

사용이 코드가 검사에게 응답 사용자 @의 irshad 셰이크에 대한 if(response!=null&&response .length()>0)

+0

감사를 .. 그러나 그것은 5 루프에 실패 다시 같은 일이 생깁니다 .. URL이로드되지 않는다고 생각하는 중 일부 시간 .. 오류가 발생했습니다 ..하지만 ... 가능하면 해결할 수있는 방법을 제안 해주세요. 내 라인을 추가 한 적이 있지만 같은 오류 – MLN

+0

은 response.length()의 로그를 출력하고 0보다 큰 모든 시간에 데이터를 가져 오는 것을 볼 수 있습니다. –

+0

나는 로그 라인'System.out.print ("@@@@@@@ Working $$$$$$$")을 추가했다. 그러나 .. 이전의 Logcat과 비슷하다. 나는 URL의 insted이다. 점점 작업 ... 나는 이것을'if (응답! = null && 응답 .length()> 0)'.. 안에 추가했다. 그러나 여전히 나는 같은 오류가 발생한다. – MLN

관련 문제