2012-04-01 7 views
0

Ich entwickle Android Apps,Android - Grid des onResume

einmal Teil dieser Apps ist eine Gridview erstellen, die einige Bilder enthalten (das Bild wird von URL geladen),

dann eine andere Aktivität, die die ausgewählte zeigen Bild im Vollbild wird angezeigt, wenn eines der Bilder in GridView onClick ist.

Problem:

Wenn ich die Gridview-Aktivität geben, es einige Sekunden dauert in der Regel alle Bild in gridview zu laden.

Dann klicke ich eine Bild der gesamte Bildschirm Aktivität eingeben und Taste, um Gridview zu gehen klicken zurück,

aber dauert es einige zu Laden Sekunde, wenn zu gridview gehen zurück, ebenso wie alle Bild Läden wieder .

Ich frage mich, warum die Gridview-Aktivität für ein paar Sekunden geladen wird, wenn onResume?

Zum Beispiel kann in Google Play die Vollbildansicht eines Beispielabbilds in beliebigen Apps sofort zur vorherigen Ansicht zurückkehren.

Geschlossenen Code:

Gridview:

public class ManagePhoto extends Activity { 

ImageAdapter ia; 
GridView gridview; 
InputStream inputStream; 
private static final int SELECT_PICTURE = 1; 
private String selectedImagePath; 
TextView tvRunningMark; 
boolean bRunning; 
String[] purl; 
Bitmap[] bm; 
String the_string_response; 
TouchImageView touch; 
public void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.photo_manage); 

    //gv is Gobal Value 
    final Gvalue gv = ((Gvalue) getApplicationContext()); 

    gridview = (GridView) findViewById(R.id.gv_photo); 
    gridview.setOnItemClickListener(new GridView.OnItemClickListener() { 
     public void onItemClick(AdapterView adapterView, View view,int position, long id) { 
      gv.setbm(bm[position]); 
      Intent myIntent = new Intent(adapterView.getContext(), FullScreenImage.class); 
      startActivityForResult(myIntent, 0); 
     } 
    }); 
    new GridTask().execute(); 
} 

public class ImageAdapter extends BaseAdapter { 
    private Context mContext; 

    public ImageAdapter(Context c) { 
     mContext = c; 
    } 

    public int getCount() { 
     return purl.length; 
    } 

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

    public long getItemId(int position) { 
     return 0; 
    } 

    // create a new ImageView for each item referenced by the Adapter 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ImageView imageView; 
     if (convertView == null) { // if it's not recycled, initialize some 
            // attributes 
      imageView = new ImageView(mContext); 
      imageView.setLayoutParams(new GridView.LayoutParams(200,200)); 
      imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); 
      imageView.setPadding(8, 8, 8, 8); 
     } else { 
      imageView = (ImageView) convertView; 
     } 

     try { 
      bm[position] = loadBitmap(purl[position]); 
      imageView.setImageBitmap(bm[position]); 

     } catch (MalformedURLException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     return imageView; 
    } 
} 

class GridTask extends AsyncTask<Void, String, Void> { 

    @Override 
    protected void onPostExecute(Void result) { 
     gridview.setAdapter(ia); 
     final LinearLayout llo_probar = (LinearLayout)findViewById(R.id.llo_probar); 
     llo_probar.setVisibility(LinearLayout.GONE); 
     gridview.setVisibility(GridView.VISIBLE); 
    } 

    @Override 
    protected void onPreExecute() {   
    } 

    @Override 
    protected void onProgressUpdate(String... values) { 
    } 

    @Override 
    protected Void doInBackground(Void... params) {   
     getphoto(); 
     bm = new Bitmap[purl.length]; 
     ia = new ImageAdapter(ManagePhoto.this); 
     return null; 
    } 

} 

private Bitmap loadBitmap(String url) throws MalformedURLException,IOException { 
    return BitmapFactory.decodeStream(new FlushedInputStream(
      (InputStream) new URL(url).getContent())); 
} 

class FlushedInputStream extends FilterInputStream { 
    public FlushedInputStream(final InputStream inputStream) { 
     super(inputStream); 
    } 

    @Override 
    public long skip(final long n) throws IOException { 
     long totalBytesSkipped = 0L; 

     while (totalBytesSkipped < n) { 
      long bytesSkipped = in.skip(n - totalBytesSkipped); 

      if (bytesSkipped == 0L) { 
       int bytesRead = read(); 

       if (bytesRead < 0) { // we reached EOF 
        break; 
       } 

       bytesSkipped = 1; 
      } 

      totalBytesSkipped += bytesSkipped; 
     } 

     return totalBytesSkipped; 
    } 
} 

public void getphoto(){ 
    final Gvalue gv = ((Gvalue) getApplicationContext()); 
    final TextView tv_fn = (TextView) findViewById(R.id.tv_fn); 
    String result = ""; 
    ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 
    nameValuePairs.add(new BasicNameValuePair("sql", 
      ("select * from personal_photo where member_id = " + gv.getuid()))); 

    InputStream is = null; 
    // http post 
    try { 
     HttpClient httpclient = new DefaultHttpClient(); 
     HttpPost httppost = new HttpPost("http://" + gv.getserverIP() 
       + "/android_getdata.php"); 
     httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
     HttpResponse response = httpclient.execute(httppost); 
     HttpEntity entity = response.getEntity(); 
     is = entity.getContent(); 
    } catch (Exception e) { 
     Log.e("log_tag", "Error in http connection " + e.toString()); 
    } 
    // convert response to string 
    try { 
     BufferedReader reader = new BufferedReader(new InputStreamReader(
       is, "iso-8859-1"), 8); 
     StringBuilder sb = new StringBuilder(); 
     String line = null; 
     while ((line = reader.readLine()) != null) { 
      sb.append(line + "\n"); 
     } 
     is.close(); 

     result = sb.toString(); 
    } catch (Exception e) { 
     Log.e("log_tag", "Error converting result " + e.toString()); 
    } 

    // parse json data 
    try { 
     List url = new ArrayList(); 
     JSONArray jArray = new JSONArray(result); 
     for (int i = 0; i < jArray.length(); i++) { 
      JSONObject json_data = jArray.getJSONObject(i); 
      url.add(json_data.getString("save_location")); 
     } 
     int size = url.size(); 
     purl = new String[size]; 
     for (int j = 0; j < size; j++) { 
      purl[j] = (String) url.get(j); 
     } 
    } catch (JSONException e) { 
     Log.e("log_tag", "Error parsing data " + e.toString()); 
    } 
} 

public void toast(String text) { 
    Toast.makeText(ManagePhoto.this, text, 5).show(); 
} 
} 

Vollbild:

public class FullScreenImage extends Activity { 
TouchImageView touch; 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN); 
    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    new ShowPhotoTask().execute(); 
} 

class ShowPhotoTask extends AsyncTask<Void, String, Void> { 


    @Override 
    protected void onPostExecute(Void result) { 
     setContentView(touch); 
    } 

    @Override 
    protected void onPreExecute() { 
     setContentView(R.layout.full_image); 
    } 

    @Override 
    protected void onProgressUpdate(String... values) { 
    } 

    @Override 
    protected Void doInBackground(Void... params) { 
     final Gvalue gv = ((Gvalue) getApplicationContext()); 
     touch = new TouchImageView(FullScreenImage.this); 
     touch.setMaxZoom(4f); // change the max level of zoom, default is 3f 
     touch.setImageBitmap(gv.getbm()); 
     return null; 
    } 

} 
} 

Antwort

0

Von Ihrem getView Code in Ihrem ImageAdapter, jedes Mal, wenn Sie das Bild wieder aus dem Internet laden.

Sie sollten das Bild auf lokale, das nächste Mal herunterladen, wenn Sie das Bild festlegen, versuchen Sie es zuerst von lokalen erhalten.

Sie sollten auch die Get-Bitmap in den Thread einfügen, während Sie den Parse-JSON in den Thread einfügen.

Hier ist ein demo, ich denke, es wird Ihnen helfen.

0

In Ihrem gridview Onclick Sie beginnen Aktivität mit startActivityForResults (Absicht, 0); Ersetze es durch startActivity (intent);

Auch wenn Sie die FullScreenActivity beenden, verwenden Sie einfach finish();

könnte Ihr Problem

+0

ich nur Änderungen .. startActivity (Absicht); und am Ende() zu OnBackPressed() in FullScreenActivity, aber nicht funktioniert .. Danke für Hilfe –

+0

Was ist das Ergebnis jetzt? – Ishu

+0

gleiche, auch brauchen einige Sekunden für das Laden in onBack –

0

Es ist so langsam lösen, weil Sie Ihre Operationen mit Hintergrund-Threads, Caching nicht ausführen .. A einfache und besser Lösung könnte eine Sammlung sein, die eingefügt alle Bitmaps enthält von AsyncTasks, die Sie ausführen, um die Bilder herunterzuladen.

Es gibt bessere Lösungen, aber sie sind schwieriger zu implementieren. Zum Beispiel können Sie die Möglichkeit in Betracht ziehen, einen Thread-Pool zu behalten, der Ihre Runnables auflöst, die durch "download the http://jhon.doe.jpg" und dann "show on the UI thread" dargestellt werden.

+0

Sorry, ich bin Neuling in Android zu entwickeln. Können Sie mir einen Vorschlag für bessere Lösungen machen? Hast du eigentlich eine Vorstellung davon, wie "Google Play" das tut, was ich oben erwähne? –

0

Wie Sie in der getView() -Methode unten Funktion geschrieben haben:

bm[position] = loadBitmap(purl[position]); 

Ich würde sagen, Sie Code Last Bild Asynchron implementieren sollte. In dieser Logik wird das Bild auf Ihrer Speicherkarte synchronisiert, sobald das Herunterladen abgeschlossen ist. Beim nächsten Mal wird es direkt von der Speicherkarte geladen, anstatt es erneut aus dem Internet zu laden.

Hier ist ein Codebeispiel Sie einen Versuch geben können: Android - Universal Image Loader