2012-04-01 4 views
0

Я занимаюсь разработкой программы,Android - GridView в onResume

когда часть этого приложения является создание GridView, которые содержат некоторое изображение (изображение загружается из URL),

затем другой деятельности, которые показывают выбранный изображение в полноэкранном режиме появится, когда одно из изображений в GridView будет onClick.

Проблема:

Когда я вхожу в GridView активности, это занимает некоторое второе, чтобы загрузить все изображения в GridView нормально.

Затем я нажимаю один из изображения, чтобы войти в полном экране деятельность и нажмите кнопку возврата, чтобы вернуться к GridView,

, но это занимает некоторое второе погрузки, когда вернуться к GridView, так же, как загружаются все изображения снова ,

Интересно, почему активность gridview будет загружаться в течение нескольких секунд, когда onResume?

Например, в Google Play полноэкранный просмотр образца изображения в любых приложениях можно вернуться к предыдущему виду.

закрываемый код:

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(); 
} 
} 

Полный экран:

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; 
    } 

} 
} 

ответ

0

Код getView в вашем ImageAdapter, каждый раз, когда вы загружаете изображение из Интернета снова.

Вы должны загрузить изображение на локальный, в следующий раз, когда вы установили изображение, вы попытаетесь получить его с первого места.

Также вы должны поместить растровое изображение get в поток, поскольку вы помещаете разбор JSON в поток.

Вот demo, я думаю, это вам поможет.

0

В вашем GridView OnClick вы начинаете деятельность с startActivityForResults (умысел, 0); замените его на startActivity (намерение);

также, когда вы заканчиваете FullScreenActivity, просто используйте finish();

может решить вашу проблему

+0

Я только изменения в .. startActivity (намерение); и на финише() на onBackPressed() в FullScreenActivity, но не работает .. Спасибо за помощь –

+0

Какой результат сейчас? – Ishu

+0

такой же, также нужно немного секунды для загрузки inBack –

0

Это настолько медленно, потому что вы не будете выполнять свои операции с фоновыми потоками, кэширование .. простой и лучше решение может быть коллекция, которая содержит все растровые изображения, вставленные по AsyncTasks, который вы выполнили для загрузки изображений.

Есть лучшие решения, но их сложнее реализовать. Например, вы можете рассмотреть возможность сохранения пула потоков, который разрешает ваши runnables, представленные как «загрузить http://jhon.doe.jpg», а затем «показать сейчас в потоке пользовательского интерфейса».

+0

Извините, я новичок в android. Можете ли вы дать мне некоторое представление об этом лучшем решении? На самом деле, вы имеете какое-либо представление о том, как «Google Play» делает это, о чем я упоминал выше? –

0

Как вы написали ниже функции внутри метода GetView():

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

Я бы сказал, вы должны реализовать код для загрузки изображения Асинхронный. В этой логике изображение синхронизируется на вашей карте памяти после ее загрузки. Поэтому в следующий раз он будет загружаться непосредственно с карты памяти, а не загружать ее из Интернета.

Вот пример кода, вы можете дать попробовать: Android - Universal Image Loader