2015-12-07 20 views
-1

當應用程序首次在設備上運行時,我將從數據庫中獲取數據並將其保存到SQLite中,以便用戶可以在脫機時使用它。具有多個JsonRequest的AsyncTask

我的代碼是這樣的。

public class AsyncDatas extends AsyncTask<Void,Void,Void> { 
    private Context context; 
    private List<ModelAccounts> accountDatas; 
    private List<ModelPoi> poiDatas; 
    private List<ModelComments> commentDatas; 
    private List<ModelImage> imageDatas; 
    private List<ModelFavorite> favoriteDatas; 
    final String MY_PREFS_NAME = "USER"; 
    private List<ModelAccounts> accountDatas2; 
    private int count; 
    private Bitmap[] thumbnails; 
    private Activity activity; 

    public AsyncDatas(Context context,Activity activity){ 
     this.context = context; 
     this.activity = activity; 
    } 


    @Override 
    protected Void doInBackground(Void... params) { 
     RequestQueue requestUsers = Volley.newRequestQueue(context); 
     JsonObjectRequest jsonObjectUsers = new JsonObjectRequest(Request.Method.POST, 
       GET_USER_URL, new Response.Listener<JSONObject>() { 
      @Override 
      public void onResponse(JSONObject response) { 
       ModelAccounts modelAccounts = new ModelAccounts(); 
       try { 
        JSONArray jsonArray = response.getJSONArray("poi"); 
        for (int i = 0; i < jsonArray.length(); i++) { 
         JSONObject jsonObject = jsonArray.getJSONObject(i); 
         int getID = jsonObject.getInt("id"); 
         accountDatas = new Select().from(ModelAccounts.class).where(Condition.column(ModelAccounts$Table.USER_ID).is(getID)).queryList(); 
         if (accountDatas.size() == 0) { 
          modelAccounts = new ModelAccounts(); 
          modelAccounts.setFname(jsonObject.getString("firstname")); 
          modelAccounts.setLname(jsonObject.getString("lastname")); 
          modelAccounts.setUname(jsonObject.getString("username")); 
          modelAccounts.setPword(jsonObject.getString("password")); 
          modelAccounts.setImg(jsonObject.getString("img")); 
          modelAccounts.setUser_id(String.valueOf(getID)); 
          modelAccounts.save(); 
         } 
         Log.e("DONE","DONE USEr"); 
        } 
       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 
      } 
     }, new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) { 
      } 
     }); 
     requestUsers.add(jsonObjectUsers); 


     RequestQueue requestFavorites = Volley.newRequestQueue(context); 
     JsonObjectRequest jsonObjectFav = new JsonObjectRequest(Request.Method.POST, 
       GET_FAV_URL, new Response.Listener<JSONObject>() { 
      @Override 
      public void onResponse(JSONObject response) { 
       ModelFavorite modelFavorite = new ModelFavorite(); 
       try { 
        JSONArray jsonArray = response.getJSONArray("poi"); 
        for (int i = 0; i < jsonArray.length(); i++) { 
         JSONObject jsonObject = jsonArray.getJSONObject(i); 
         int getID = jsonObject.getInt("id"); 
         favoriteDatas = new Select().from(ModelFavorite.class).where(Condition.column(ModelFavorite$Table.FAVORITE_ID).is(getID)).queryList(); 
         if (favoriteDatas.size() == 0) { 
          modelFavorite = new ModelFavorite(); 
          modelFavorite.setLatitude(jsonObject.getString("latitude")); 
          modelFavorite.setUser_id(jsonObject.getString("user_id")); 
          modelFavorite.setType(jsonObject.getString("type")); 
          modelFavorite.setFavorite_id(String.valueOf(getID)); 
          modelFavorite.save(); 
         } 
        } 
        Log.e("DONE","DONE FAV"); 
       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 
      } 
     }, new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) { 
      } 
     }); 
     requestFavorites.add(jsonObjectFav); 



     RequestQueue requestPOI = Volley.newRequestQueue(context); 
     JsonObjectRequest jsonObjectPOI = new JsonObjectRequest(Request.Method.POST, 
       INSERT_POI_URL, new Response.Listener<JSONObject>() { 
      @Override 
      public void onResponse(JSONObject response) { 
       ModelPoi modelPoi = new ModelPoi(); 
       try { 
        JSONArray jsonArray = response.getJSONArray("poi"); 
        for (int i = 0; i < jsonArray.length(); i++) { 
         JSONObject jsonObject = jsonArray.getJSONObject(i); 
         int getID = jsonObject.getInt("id"); 
         poiDatas = new Select().from(ModelPoi.class).where(Condition.column(ModelPoi$Table.POI_ID).is(getID)).queryList(); 
         if(poiDatas.size()==0){ 
          modelPoi = new ModelPoi(); 
          modelPoi.setPOI(jsonObject.getString("POI")); 
          modelPoi.setPOIAddress(jsonObject.getString("POIAddress")); 
          modelPoi.setPOIType(jsonObject.getString("POIType")); 
          modelPoi.setPOILat(jsonObject.getString("POILat")); 
          modelPoi.setPOILong(jsonObject.getString("POILong")); 
          modelPoi.setPOIInfo(jsonObject.getString("POIInfo")); 
          modelPoi.setPoi_id(String.valueOf(getID)); 
          modelPoi.save(); 
         } 
         Log.e("DONE","DONE POI"); 
        } 
       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 
      } 
     }, new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) { 

      } 

     }); 
     requestPOI.add(jsonObjectPOI); 



     RequestQueue requestComments = Volley.newRequestQueue(context); 
     JsonObjectRequest jsonObjectComments = new JsonObjectRequest(Request.Method.POST, 
       COMMENTS_URL, new Response.Listener<JSONObject>() { 
      @Override 
      public void onResponse(JSONObject response) { 
       ModelComments modelComments; 
       try { 
        JSONArray jsonArray = response.getJSONArray("poi"); 
        for (int i = 0; i < jsonArray.length(); i++) { 
         JSONObject jsonObject = jsonArray.getJSONObject(i); 
         int getID = jsonObject.getInt("id"); 
         commentDatas = new Select().from(ModelComments.class).where(Condition.column(ModelComments$Table.COMMENT_ID).is(getID)).queryList(); 
         if (commentDatas.size() == 0) { 
          modelComments = new ModelComments(); 
          modelComments.setLatitude(jsonObject.getString("latitude")); 
          modelComments.setComment_id(jsonObject.getString("id")); 
          modelComments.setComment(jsonObject.getString("comment")); 
          modelComments.setDate(jsonObject.getString("date")); 
          modelComments.setTitle(jsonObject.getString("title")); 
          modelComments.setUser_id(jsonObject.getString("user_id")); 
          modelComments.setRating(jsonObject.getString("rating")); 
          modelComments.setComment_id(String.valueOf(getID)); 
          modelComments.save(); 
         } 
         Log.e("DONE","DONE COMMENTS"); 
        } 
       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 
      } 
     }, new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) { 

      } 
     }); 
     requestComments.add(jsonObjectComments); 



     RequestQueue requestImage = Volley.newRequestQueue(context); 
     JsonObjectRequest jsonObjectImage = new JsonObjectRequest(Request.Method.POST, 
       GET_IMAGE_URL, new Response.Listener<JSONObject>() { 
      @Override 
      public void onResponse(JSONObject response) { 
       ModelImage modelImage = new ModelImage(); 
       try { 
        JSONArray jsonArray = response.getJSONArray("poi"); 
        for (int i = 0; i < jsonArray.length(); i++) { 
         JSONObject jsonObject = jsonArray.getJSONObject(i); 
         int getId = jsonObject.getInt("id"); 
         imageDatas = new Select().from(ModelImage.class).where(Condition.column(ModelImage$Table.IMAGE_ID).is(getId)).queryList(); 
         if (imageDatas.size()==0) { 
          modelImage = new ModelImage(); 
          modelImage.setLatitude(jsonObject.getString("latitude")); 
          modelImage.setImg(jsonObject.getString("imagepath")); 
          modelImage.setUser_id(jsonObject.getString("user_id")); 
          modelImage.setDatetime(jsonObject.getString("datetime")); 
          modelImage.setImage_id(String.valueOf(getId)); 
          modelImage.save(); 
         } 
         Log.e("DONE","DONE IMG"); 
        } 
       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 
      } 
     }, new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) { 
      } 
     }); 
     requestImage.add(jsonObjectImage); 






     final String[] columns = {MediaStore.Images.Media.DATA, MediaStore.Images.Media._ID}; 
     final String orderBy = MediaStore.Images.Media._ID; 
     Cursor imagecursor = context.getContentResolver().query(
       MediaStore.Images.Media.EXTERNAL_CONTENT_URI, columns, null, 
       null, orderBy); 
     int image_column_index = imagecursor.getColumnIndex(MediaStore.Images.Media._ID); 
     this.count = imagecursor.getCount(); 
     this.thumbnails = new Bitmap[this.count]; 

     Variable.IMAGES = new ArrayList<>(); 
     for (int i = 0; i < this.count; i++) { 
      imagecursor.moveToPosition(i); 
      int id = imagecursor.getInt(image_column_index); 
      int dataColumnIndex = imagecursor.getColumnIndex(MediaStore.Images.Media.DATA); 
      thumbnails[i] = MediaStore.Images.Thumbnails.getThumbnail(
        context.getContentResolver(), id, 
        MediaStore.Images.Thumbnails.MICRO_KIND, null); 
      Variable.IMAGES.add("file://" + imagecursor.getString(dataColumnIndex)); 
      Log.e("IMAGE","DOME IMAGE"); 
     } 

} 

有時它確實有效,有時它沒有。
無論如何要平滑上述代碼中的過程?
有時它的工作意味着,所有的數據都會被提取。
有時候這並不意味着,只有少數幾個數據被提取。
只喜歡第一個RequestQueue工作..
謝謝。

+0

那我該怎麼辦?這就是我迄今所知道的。所以我用它。謝謝 –

+0

使用fx google找到類似的問題並使用那裏提供的解決方案。簡而言之:1.鏈接異步方法(在prev完成時請求下一個請求)調用或2.使用某種信號量並等待所有執行......當然,這也將很好地理解正在發生的事情用你的代碼 - 理解異步回調的基礎知識(**就像:代碼請求已在onResponse中完成,而不是在將它放入請求隊列**之後) – Selvin

+0

謝謝先生。我會嘗試所有的輸入。謝謝。如果問題仍然存在,我會回來的。謝謝 –

回答

-2

你正在做一個AsyncTask的工作。同樣爲了代碼的可讀性,我建議將這些代碼分成更小的塊,或者每個API(web服務)調用的一個任務。那麼你將獲得所有你需要的數據。決定優先級,然後相應地調整任務。

+0

然後,沒有其他的過程來做到這一點,只是爲了分割代碼。 所以如果我有5個Web服務,我會有5個Asynctasks? –

+0

不寫簡化的代碼例如編寫一個asynctask,它將具有用請求參數調用api並返回響應的功能。然後爲每個api調用這個asynce任務5次,然後處理響應。代碼可重用性是您的答案。 – TheAndroidFreak

+0

有人評論說,我不應該使用異步方法的asyncmethod裏面.. 但我會嘗試你的建議。 –