2014-03-28 3 views
0

URL에서 JSON 응답을 받고 문자열로 변환합니다. 응답에서 이미지 URL을 얻습니다. URL에서 해당 이미지를 다운로드하여 ListView에 표시하려고합니다. 그러나이 작업에는 많은 시간이 걸리고 모든 이미지가 다운로드 될 때까지 빈 화면이 표시됩니다. 화면이 거의 40-50 초 동안 표시됩니다. 또한 ListView 매우 부드럽지 않습니다. 빈 화면이 나타나지 않게하려면 어떻게합니까?URL에서 이미지를 다운로드하고 ListView android에 표시하는 동안 빈 화면이 표시됩니다.

여기 내 코드입니다 : -

String registerContet = "myUrl"; 

    String items; 
    try 
    { 

     items = new FetchItems().execute(registerContet).get(); 

     pDialog = new ProgressDialog(this).show(Home.this, "Fetching news items", "Please wait.."); 

     JSONArray jObject = new JSONArray(items); 
     for (int i = 0; i < jObject.length(); i++) 
     { 
      JSONObject menuObject = jObject.getJSONObject(i); 

      String title= menuObject.getString("Title"); 
      String description= menuObject.getString("BodyText"); 
      String thumbnail= menuObject.getString("ThumbnailPath"); 
      String newsUrl = menuObject.getString("Url"); 
      String body = menuObject.getString("Body"); 
      String newsBigImage = menuObject.getString("ImageBlobUrls"); 

       map = new HashMap<String,String>(); 
       map.put(SOURCETITLE, title); 
       map.put(TITLE, description); 
       map.put(THUMBNAILPATH, thumbnail); 
       map.put(BODY, body); 
       map.put(URL, newsUrl); 
       map.put(IMAGEBLOBURLS,newsBImage); 

       myNList.add(map); 

    } 
     itemsAdapter = new LazyAdapter(Home.this, myNList); 
     if(pDialog!=null && pDialog.isShowing()) 
     { 
      pDialog.dismiss(); 
     } 
     nList.setAdapter(itemsAdapter); 

     nList.setOnItemClickListener(new OnItemClickListener() 
     { 

      @Override 
      public void onItemClick(AdapterView<?> arg0, 
        View arg1, int position, long arg3) 
      { 
       // TODO Auto-generated method stub 
       myDialog = new ProgressDialog(Home.this).show(Home.this, "Fetching news..", "Just a moment"); 


       HashMap<String, String> myMap = myNList.get(position); 
       Intent nIntent = new Intent(Home.this,NDetails.class); 
       newsIntent.putExtra("NItems", myMap); 

       startActivity(nIntent); 

      } 
     }); 
    } 
    catch (InterruptedException e) { 

     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (ExecutionException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (JSONException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 



} 









private class FetchItems extends AsyncTask<String, String, String> 
{ 
    // TODO Auto-generated method stub 
    ProgressDialog myDialog; 

      @Override 
      protected String doInBackground(String... params) 
      { 
       // TODO Auto-generated method stub 
       HttpResponse response =null; 
       String resultString = ""; 
       String myResponseBody = "" ; 
       // Creating HTTP client 
         HttpClient httpClient = new DefaultHttpClient(); 
         // Creating HTTP Post 
         HttpGet request = new HttpGet(params[0]); 
         try 
         { 
          response = httpClient.execute(request); 
          if(response.getStatusLine().getStatusCode()== 200) 
          { 
           HttpEntity entity = response.getEntity(); 
           if (entity != null) 
           { 

            InputStream inputStream = entity.getContent(); 
            myResponseBody = convertToString(inputStream); 
           } 
          } 
         } 
         catch(Exception e) 
         { 
         } 
       return myResponseBody; 
      } 





@Override 
      protected void onPostExecute(String result) 
{ 
       // TODO Auto-generated method stub 
       super.onPostExecute(result); 
       /*if(myDialog.isShowing()) 
       { 
        myDialog.dismiss(); 
       }*/ 
      } 





      @Override 
      protected void onPreExecute() 
      { 
       // TODO Auto-generated method stub 
       super.onPreExecute(); 
       /*myDialog = new ProgressDialog(Home.this); 
       myDialog.setMessage("Loading"); 
       myDialog.show();*/ 
      } 

사람이 나를 내가이 문제를 해결하는 방법을 알 수 있습니다. 감사합니다

+0

나만의 로딩을 위해 유니버설 이미지 로더 클래스를 사용할 수 있습니다. –

답변

0

사용 Universal Image Loader, 이미지를 저장하고 여러 가지면에서 도움이됩니다.

  • 멀티 스레드 이미지 로딩
  • 넓은 동조하여 ImageLoader의 구성 (스레드 실행기, 다운, 디코더, 메모리 및 디스크 캐시 표시 화상 옵션, 등)의 가능성
  • : 여기

    이 특징이다
  • 이미지의 가능성 메모리 및/또는 장치의 파일 시스템 (또는 SD 카드)에 캐싱
  • 로드 프로세스를 "수신 대기"가능성 cu 구제 별매 옵션으로 모든 디스플레이 이미지 호출

여기는 link입니다. 당신은 더 읽을 수 있으며 구현하기가 매우 쉽습니다.

+0

내 코드에서 어디서 어떻게 사용할 수 있습니까? – user3354605

+0

내가 언급 한 링크를 훑어 보셨나요? –

+0

예. 그것은 도서관입니다. 그러나 나는 그것을 사용하는 방법에 대해 혼란스러워합니다. – user3354605

0

서버에서 이미지를로드 할 때는 별도의 하위 스레드를 사용해야합니다. 이미지를로드하고 이미지 캐시를 저장하는 가장 효율적이며 효율적인 방법은 범용 이미지 로더를 사용하는 것입니다.

load.displayImage(mimagebURL(), holder.image,option); 

이 라이브러리를 사용하면 이미지로드를위한 스레드에서 생성 할 필요가 없습니다.

호프가 도움이 될 것입니다.