2014-01-09 2 views
0

SQLite를 통해 캐시 데이터가 채워지는 listview가 있습니다. 로드가 완료된 후 백그라운드에서 새 데이터를 확인한 후 db에서 JSON 결과를 반환합니다. 이 코드 (코드 아래)를 실행하고,이 (50 개 루프 최대)를 통해 반복되는 동안 상기 UI 스레드가 차단되고,이 배경 task, 내 onPostExecute에서AsyncTask의 무언가 UI 차단 - 인터페이스가 잠시 중단되게 함

ListView 스크롤링 불가능 . 다음은 코드입니다.

if (result.length() != 0) { 
       JSONArray jArray = new JSONArray(result); 
       JSONObject json_data = null; 

       for (int ii = 0; ii < jArray.length(); ii++) { 
        json_data = jArray.getJSONObject(ii); 

        item = json_data.getString("item"); 
        cat = json_data.getString("category"); 
        user = json_data.getString("username"); 
        userId = json_data.getLong("user_id"); 
        review = json_data.getString("review"); 
        reviewId = json_data.getLong("review_id"); 
        itemId = json_data.getLong("item_id"); 
        commentCount = json_data.getLong("commentCount"); 
        url = json_data.getString("name"); 
        url = pathUrl + url; // for profile icon 
        date = json_data.getString("date"); 
        rating = json_data.getDouble("rating"); 
        upVote = json_data.getLong("good"); 
        wiki = json_data.getString("wiki"); 


        watchItems.add(item); 
        watchCats.add(cat); 
        watchUsers.add(user); 
        watchReviews.add(review); 
        watchUrl.add(url); 
        watchDateList.add(date); 
        watchWikiList.add(wiki); 

        watchItemIdList.add(String.valueOf(itemId)); 
        watchUserIds.add(String.valueOf(userId)); 
        watchReviewId.add(String.valueOf(reviewId)); 
        watchRating.add(String.valueOf(rating)); 
        watchCommentCount.add(String.valueOf(commentCount)); 
        watchUpVote.add(String.valueOf(upVote)); 

        Rateit.haveFollowing = "1"; 

        if (Rateit.isUserLoggedIn == true) { 
         boolean oldReview = datasource 
           .getReviewIds(reviewId); 
         if (!oldReview) { 
          // Cache Network Items 
          datasource.createTrendWatch(itemId, item, 
            review, reviewId, cat, user, 
            String.valueOf(userId), url, date, 
            commentCount, rating, upVote, 0, 
            wiki); 
         } 
        } 


         FollowingItems wti = new FollowingItems(
           Long.valueOf(watchItemIdList.get(i)), 
           watchItems.get(i), watchCats.get(i), 
           watchReviews.get(i), 
           Long.valueOf(watchReviewId.get(i)), 
           watchUsers.get(i), 
           Long.valueOf(watchUserIds.get(i)), 
           watchUrl.get(i), watchDateList.get(i), 
           Long.valueOf(watchCommentCount.get(i)), 
           Double.valueOf(watchRating.get(i)), 
           Long.valueOf(watchUpVote.get(i)), 
           watchWikiList.get(i++)); 
         watchingListObject.add(wti); 

       } 
      } 

왜 이런 일이 발생합니까? 어떻게하면 내 코드가이를 막을 수 있습니까? 내가 할 수있는 최적화가 있습니까?

편집 : 아래의 누군가가 전체 task 코드를 요청했습니다.

Below repeats the code above but in context with entire task. 

    public static class FollowingTask extends AsyncTask<String, String, Void> { 
     protected InputStream is = null; 
     protected String result = ""; 
     protected String userId; 
     protected ArrayList<FollowingItems> watchingListObject; 
     protected Context mContext; 

     public FollowingTask(Context context) { 
      mContext = context; 
     } 

     @Override 
     protected void onPreExecute() { 
      if (mContext != null && (fromRefresh == false)) { 
       ((MainFragmentActivity) mContext) 
         .setSupportProgressBarIndeterminateVisibility(true); 
      } 

      resetLists(); 

      if (PrefActivity.getUserLoggedInStatus(mContext) == true) { 
       userId = PrefActivity.getLoggedInUserId(mContext); 
      } else { 
       userId = "-1"; 
      } 

      super.onPreExecute(); 
     } 

     @Override 
     protected Void doInBackground(String... params) { 
      datasource.purgeItemWatchingTable(); 
      Log.d("1", "Back"); 
      String url_select = "http://www.---.info/includes_mc_php/featured_watching.php"; 

      HttpClient httpClient = new DefaultHttpClient(); 
      HttpPost httpPost = new HttpPost(url_select); 
      ArrayList<NameValuePair> param = new ArrayList<NameValuePair>(); 
      param.add(new BasicNameValuePair("user_id", userId)); 
      param.add(new BasicNameValuePair("v2", "true")); 



      try { 
       httpPost.setEntity(new UrlEncodedFormEntity(param)); 
       HttpResponse httpResponse = httpClient.execute(httpPost); 
       HttpEntity httpEntity = httpResponse.getEntity(); 

       // read content 
       is = httpEntity.getContent(); 

      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      try { 
       BufferedReader br = new BufferedReader(
         new InputStreamReader(is)); 
       StringBuilder sb = new StringBuilder(); 
       String line = ""; 
       while ((line = br.readLine()) != null) { 
        sb.append(line + "\n"); 
       } 
       is.close(); 
       result = sb.toString(); 

      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

      return null; 
     } 

     protected void onPostExecute(Void v) { 

      String pathUrl = Rateit.PROFILE_PIC_URL; 
      String item, cat, user, review, url, date, following, wiki; 
      long itemId, reviewId, userId, commentCount, upVote; 
      double rating; 
      int i = 0; 
      watchingListObject = new ArrayList<FollowingItems>(); 


      try { 
       String c = String.valueOf(result.charAt(0)); 

       if (c.equals("{")) { 
        JSONObject jsonObject = new JSONObject(result); 
        following = jsonObject.getString("following"); 
        if (following.equals("0")) { 
         Rateit.haveFollowing = "0"; 
        } 

       } else { 

        if (result.length() != 0) { 
         JSONArray jArray = new JSONArray(result); 
         JSONObject json_data = null; 

         for (int ii = 0; ii < jArray.length(); ii++) { 
          json_data = jArray.getJSONObject(ii); 

          item = json_data.getString("item"); 
          cat = json_data.getString("category"); 
          user = json_data.getString("username"); 
          userId = json_data.getLong("user_id"); 
          review = json_data.getString("review"); 
          reviewId = json_data.getLong("review_id"); 
          itemId = json_data.getLong("item_id"); 
          commentCount = json_data.getLong("commentCount"); 
          url = json_data.getString("name"); 
          url = pathUrl + url; // for profile icon 
          date = json_data.getString("date"); 
          rating = json_data.getDouble("rating"); 
          upVote = json_data.getLong("good"); 
          wiki = json_data.getString("wiki"); 


          watchItems.add(item); 
          watchCats.add(cat); 
          watchUsers.add(user); 
          watchReviews.add(review); 
          watchUrl.add(url); 
          watchDateList.add(date); 
          watchWikiList.add(wiki); 

          watchItemIdList.add(String.valueOf(itemId)); 
          watchUserIds.add(String.valueOf(userId)); 
          watchReviewId.add(String.valueOf(reviewId)); 
          watchRating.add(String.valueOf(rating)); 
          watchCommentCount.add(String.valueOf(commentCount)); 
          watchUpVote.add(String.valueOf(upVote)); 

          Rateit.haveFollowing = "1"; 

          if (Rateit.isUserLoggedIn == true) { 
           boolean oldReview = datasource 
             .getReviewIds(reviewId); 
           if (!oldReview) { 
            // Cache Network Items 
            datasource.createTrendWatch(itemId, item, 
              review, reviewId, cat, user, 
              String.valueOf(userId), url, date, 
              commentCount, rating, upVote, 0, 
              wiki); 
           } 
          } 


           FollowingItems wti = new FollowingItems(
             Long.valueOf(watchItemIdList.get(i)), 
             watchItems.get(i), watchCats.get(i), 
             watchReviews.get(i), 
             Long.valueOf(watchReviewId.get(i)), 
             watchUsers.get(i), 
             Long.valueOf(watchUserIds.get(i)), 
             watchUrl.get(i), watchDateList.get(i), 
             Long.valueOf(watchCommentCount.get(i)), 
             Double.valueOf(watchRating.get(i)), 
             Long.valueOf(watchUpVote.get(i)), 
             watchWikiList.get(i++)); 
           watchingListObject.add(wti); 

           Log.d("1", "Post 2"); 
         } 
        } else { 
         Rateit.haveFollowing = "2"; 
        } 
       } 
      } catch (JSONException e1) { 
       e1.printStackTrace(); 
       Rateit.haveFollowing = "2"; 
      } catch (ParseException e1) { 
       e1.printStackTrace(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      Log.d("1", "Post COMPLETE"); 
      mPullRefreshListView.onRefreshComplete(); 

      // Reset Trending List on Pull-to-Refresh 
      if (mContext != null) { 

       if (watchUsers.size() == 0) { 
        l.setVisibility(View.VISIBLE); 
        tv.setTypeface(TypeFace.get(mContext, Rateit.BPREPLAY)); 
       } else { 
        l.setVisibility(View.GONE); 
       } 

       if (mContext != null) { 

        listView.setAdapter(null); 

        if (watchItems.size() > 0) { 
         wAdapter = new FollowingAdapter(mContext, 
           watchingListObject, TypeFace.get(mContext, 
             Rateit.BPREPLAY), TypeFace.get(
             mContext, Rateit.ROBOTO_LIGHT), 
           TypeFace.get(mContext, Rateit.ROBOTO_THIN), 
           TypeFace.get(mContext, Rateit.ROBOTO_REGULAR)); 
         listView.setAdapter(wAdapter); 
        } 

       } 
      } 

      if (mContext != null && (fromRefresh == false)) { 
       ((MainFragmentActivity) mContext) 
         .setSupportProgressBarIndeterminateVisibility(false); 
       MainFragmentActivity.dismissDialog(mContext); 

      } 

      fromRefresh = false; 

     } 
    } 
+0

'onPostExecute'는 UI 스레드에서 실행됩니다. 그것은 UI를 차단합니다. 'doInBackground'는 백그라운드에서 실행됩니다. 'onPostExecute'가 아닌'doInBackground'에서 무거운 오퍼레이션을 수행해야합니다 .. –

+0

@AmulyaKhare 예,하지만 doInBackground에서 JSON 항목을 구문 분석 할 수 있다고 생각하지 않습니다. – KickingLettuce

+0

힌트 : SQLite에서 데이터를로드하려면 데이터베이스 당신은'Louders' asyncTask가 아닌 것으로 생각해야합니다. – Coderji

답변

1

onPostExecute이 UI 스레드에서 실행됩니다. 그것은 UI를 차단합니다. doInBackground이 백그라운드에서 실행됩니다. 당신은 doInBackground

(안 onPostExecute에서) 솔루션에 무거운 opertaions을 수행해야합니다 : 당신이 doInBackgroundonPostExecute 등에서 구문 분석을 이동하고 단지 UI로 처리 된 정보를 결합하기위한 onPostExecute를 사용해야합니다.

0

는 그 코드를 프로파일 링하고 정확하게 그것을 실행하기 위해 소요되는 시간이 얼마나 측정하기 위해 우선으로 건의 할 것입니다. 이 방법은 문제가 실제로 여기 또는 다른 곳에있는 경우 최소한 이해합니다.

+0

을 들었습니다.이 루프에'Log'를 넣고 UI가 차단되면 장치를 보았습니다. 루프가 계속되었습니다. 이거 야. (위의 코드). – KickingLettuce

관련 문제