2013-10-01 39 views
0

我的圖庫存在問題,它會變慢並且滯後。我正在從圖像適配器的服務器加載圖像:Android:緩慢的圖庫視圖

package com.example.ocenitaksi; 

import java.io.IOException; 
import java.io.InputStream; 
import java.io.UnsupportedEncodingException; 
import java.net.HttpURLConnection; 
import java.net.URL; 
import java.net.URLConnection; 
import java.net.URLEncoder; 

import org.apache.http.client.utils.URLEncodedUtils; 

import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.ImageView; 
import android.widget.TextView; 



public class ImageAdapter extends BaseAdapter { 
    private Context context; 
    private final String[] mobileValues; 

    public ImageAdapter(Context context, String[] mobileValues) { 
     this.context = context; 
     this.mobileValues = mobileValues; 
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 

     LayoutInflater inflater = (LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     View gridView; 

     if (convertView == null) { 

      gridView = new View(context); 

      // get layout from mobile.xml 
      gridView = inflater.inflate(R.layout.mobile, null); 


      // set image based on selected text 
      ImageView imageView = (ImageView) gridView 
        .findViewById(R.id.grid_item_image); 



      // ubacivanje slika za string 


       String mobile = mobileValues[position]; 
       if (mobile.equals(MainActivity.imena[position])) { 
       //imageView.setImageURI("http://24.media.tumblr.com/avatar_a400b4dbb80e_64.png"); 
       Bitmap bitmap=null;; 

       mobile = mobile.replace(" ", "_"); 

         bitmap = DownloadImage("http://android.yunews.net/images/"+mobile+".png"); 


        imageView.setImageBitmap(bitmap); 

       } 


     } 
     else { 
      gridView = (View) convertView; 
     } 

     return gridView; 
    } 

    @Override 
    public int getCount() { 
     return mobileValues.length; 
    } 

    @Override 
    public Object getItem(int position) { 
     return null; 
    } 

    @Override 
    public long getItemId(int position) { 
     return 0; 
    } 
    private InputStream OpenHttpConnection(String urlString) throws IOException { 
     InputStream in = null; 
     int response = -1; 

     URL url = new URL(urlString); 
     URLConnection conn = url.openConnection(); 

     if (!(conn instanceof HttpURLConnection)) 
      throw new IOException("Not an HTTP connection"); 

     try { 
      HttpURLConnection httpConn = (HttpURLConnection) conn; 
      httpConn.setAllowUserInteraction(false); 
      httpConn.setInstanceFollowRedirects(true); 
      httpConn.setRequestMethod("GET"); 
      httpConn.connect(); 
      response = httpConn.getResponseCode(); 
      if (response == HttpURLConnection.HTTP_OK) { 
       in = httpConn.getInputStream(); 
      } 
     } catch (Exception ex) { 
      throw new IOException("Error connecting"); 
     } 
     return in; 
    } 

    private Bitmap DownloadImage(String URL) { 
     Bitmap bitmap = null; 
     InputStream in = null; 
     try { 
      in = OpenHttpConnection(URL); 
      bitmap = BitmapFactory.decodeStream(in); 
      in.close(); 
     } catch (IOException e1) { 
      // TODO Auto-generated catch block 
      e1.printStackTrace(); 
     } 
     return bitmap; 
    } 
} 

這是我主要活動的一部分。

private class LongOperation extends AsyncTask<String, Void, String> 
    { 
     protected void onPreExecute() 
     { 
      progressDialog = new ProgressDialog(MainActivity.this); 
      progressDialog.setTitle("Molimo sacekajte..."); 
      progressDialog.setMessage("Ucitavam taksi sluzbe..."); 
      progressDialog.setCancelable(true); 
      progressDialog.show(); 
     } 

     protected String doInBackground(String... params) 
     { 

       niz = new JSONFunkcije().ListaSluzbi(); 

       imena= new String[niz.size()]; 
       Iterator<String> it= niz.iterator(); 
       for (int i=0;i<niz.size();i++) 
        imena[i]=it.next(); 
       slicice = new ImageAdapter(MainActivity.this, imena); 


      return null; 
     } 
     protected void onPostExecute(String result) 
     { 

      progressDialog.dismiss(); 

      runOnUiThread(new Runnable() { 
       public void run() { 
        /** 
        * Updating parsed JSON data into ListView 
        * */ 
        //Button dugme1 = (Button) findViewById(R.id.dugme1); 

        ///params.height = "50dpi"; 
        //dugme1.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, 100)); 

        Gallery gridView = (Gallery) findViewById(R.id.gallery1); 

        gridView.setAdapter(slicice); 
        //kraj ucitvanja 

        //gridView.setAdapter(adapter); 
        gridView.setOnItemClickListener(new OnItemClickListener() { 
         @Override 
         public void onItemClick(AdapterView<?> parent, View v, 
           int position, long id) { 

          // Sending image id to FullScreenActivity 
          Intent i = new Intent(getApplicationContext(), TaksiDetalji.class); 
          // passing array index 
          i.putExtra("id", imena[position]); 
          startActivity(i); 
         } 
        }); 

       } 
      }); 
     System.gc(); 
     } 
     } 

我「M從OnCrate調用LongOperation:

mytask = new LongOperation(); 
     mytask.execute(); 

有毛病ImageAdapter?呼叫過多,下載?我試圖緩存圖像,但我失敗了。

+0

請注意,onPostExecute在主線程上運行,因此不需要調用'runOnUiThread'。 –

+0

您在您的getView函數中調用'DownloadImage',該函數也在UI線程上運行。該功能似乎直接下載圖像。請在github上查看Sergey Tarasevich的Android-Universal-Image-Loader:https://github.com/nostra13/Android-Universal-Image-Loader –

+0

沒有它,它是一樣的。 – Aleksa

回答

0

從你的代碼,我會說有很多的原因和下列所有這些原因,其運行緩慢:

  1. 您還沒有跟上ViewHolder pattern。閱讀文檔也是Making ListView Scrolling Smooth
  2. 您還沒有跟上加載圖像的標準方式(在本地緩存,即圖像,負荷從地方如果已經緩存)

更好您嘗試使用任何庫(Universal Image loader或任何)在網頁上加載你的ListView中的圖像。