2014-03-28 98 views
0

我從URL獲取JSON響應並將其轉換爲字符串。我從響應中獲取圖片的網址。我想從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

你也可以使用通用圖像加載器類來進行延遲加載。 – 2014-03-28 10:55:35

回答

0

使用Universal Image Loader,它緩存您的圖像,並以多種方式幫助你。

下面是特徵:

  • 多線程圖像加載
  • 的寬調諧ImageLoader的的 配置(螺紋執行人,下載器,解碼器,存儲器和盤 緩存,顯示圖像的選擇,及其他)的可能性
  • 可能性圖像 緩存在內存和/或設備的文件系統(或SD卡)
  • 可能性「傾聽」加載過程可能性爲cu stomize 每個顯示圖像調用分開的選項

這裏是link。你可以進一步閱讀,而且很容易實現。

+0

你能告訴我在哪裏以及如何在代碼中使用它 – user3354605

+0

你是否瀏覽了我提到的鏈接? –

+0

亞我有。這是一個圖書館。但我對如何使用它感到困惑 – user3354605

0

您應該使用單獨的子線程從服務器加載映像。 使用通用Image Loader加載圖像並保存圖像緩存的最佳高效方法。

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

使用這個庫,你不需要在線程上創建加載圖像。

希望這會對你有所幫助

相關問題