2012-04-01 5 views
0

これの一部がアプリたら、私は、アンドロイド - GridViewのonResume

をAndroidアプリを開発していますが、(画像をURLからロードされた)いくつかの画像が含まれているのGridViewを作成

され、選択を表示し、別のアクティビティGridView内の画像の1つがonClickのとき、フルスクリーンの画像が表示されます。

問題:私はGridViewのアクティビティを入力すると、それは通常のGridView内のすべての画像をロードするために、いくつかの秒かかる

それから私は、フルスクリーンの活動に入り、背中のGridViewに行くためにボタンを戻す]をクリックして画像のいずれかをクリックし

しかし、もう一度、すべての画像をロードするように、バックのGridViewに行くときには、負荷にいくつかの秒を要します。

なぜ、onResumeのときにgridviewアクティビティが数秒間読み込まれるのだろうと思いますか?

たとえば、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(); 
} 
} 

フルスクリーン:あなたのGridViewで

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

ImageAdaptergetViewコードから、毎回インターネットから画像を読み込みます。

イメージをローカルにダウンロードする必要があります。次回は、イメージを設定したら、まずローカルから取得しようとします。

また、パーズJSONをスレッドに入れたまま、getビットマップをスレッドに配置する必要があります。

ここにはdemoがあると思います。

0

あなたはstartActivityForResults(意図、0)で活動を始めているのonclick。それをstartActivity(intent)に置き換えます。

また、FullScreenActivityを終了するときにfinish()を使用します。

シンプルより良いソリューションが挿入されたすべてのあなたのビットマップを含むコレクション可能性が..あなたがバックグラウンドスレッド、キャッシュを使用して操作を実行していないので、それはとても遅いです

+0

私はちょうど.. startActivity(意図)に変更します。 FullScreenActivityのonBackPressed()にfinish()を実行しても機能しません。ヘルプありがとうございました –

+0

結果はどうなりますか? – Ishu

+0

同じ、また、ロードするためにいくつかの秒をonBack –

0

問題解決かもしれませんあなたが写真をダウンロードするために実行するAsyncTasksによって。

もっと良い解決策がありますが、実装が難しいです。 たとえば、「http://jhon.doe.jpgをダウンロードしてください」と表示されたランナブルを解決し、「今すぐUIスレッドに表示する」というスレッドプールを維持する可能性を考慮することができます。

+0

申し訳ありませんが、私はアンドロイド開発の初心者です。その優れたソリューションについていくつかご提案いただけますか?実際に、私は上記の「Google Play」のやり方について考えていますか? –

0

あなたはgetViewメソッド()メソッド内の関数の下に書かれているとおり:

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

私はあなたが非同期負荷イメージにコードを実装する必要がありますと言うでしょう。このロジックでは、ダウンロードが完了するとイメージがメモリカードに同期されます。次回は、ウェブから直接ロードするのではなく、メモリカードから直接ロードします。ここで

は、あなたが試してみることができ、コードの例です:Android - Universal Image Loader

関連する問題