2

EditContactアクティビティと同様のことをしたい(簡単な追加ボタンで連絡するためにさまざまな番号を追加する)。

私の最初のアプローチは、アクティビティレイアウトに動的に追加するカスタムレイアウトを作成することでした(動的にコンポーネントが追加されたアクティビティはフリーズします)ユーザーBudiusは、ソリューションを実現するためにカスタムアダプターでリストビューを使用すると述べました。だから私はそれを試しましたが、動作は私の最初の試みのように終了します。

3〜4エントリを追加すると、アクティビティがフリーズします。(Galaxy s3とエミュレーターで)

多分あなたは考えを持っていますか?

Logcat:

11-01 15:42:33.214: D/dalvikvm(712): GC_CONCURRENT freed 148K, 3% free 8283K/8519K, paused 74ms+102ms, total 242ms
11-01 15:42:33.733: I/Choreographer(712): Skipped 93 frames!  The application may be doing too much work on its main thread.
11-01 15:42:42.293: I/Choreographer(712): Skipped 49 frames!  The application may be doing too much work on its main thread.
11-01 15:42:44.946: D/dalvikvm(712): GC_CONCURRENT freed 72K, 2% free 8672K/8839K, paused 16ms+36ms, total 224ms
11-01 15:42:45.593: I/Choreographer(712): Skipped 66 frames!  The application may be doing too much work on its main thread.
11-01 15:42:48.913: I/Choreographer(712): Skipped 35 frames!  The application may be doing too much work on its main thread.
11-01 15:42:49.093: I/Choreographer(712): Skipped 42 frames!  The application may be doing too much work on its main thread.
11-01 15:42:55.083: I/Choreographer(712): Skipped 125 frames!  The application may be doing too much work on its main thread.
11-01 15:42:55.343: I/Choreographer(712): Skipped 68 frames!  The application may be doing too much work on its main thread.
11-01 15:42:55.653: I/Choreographer(712): Skipped 40 frames!  The application may be doing too much work on its main thread.
11-01 15:43:02.553: D/dalvikvm(712): GC_CONCURRENT freed 318K, 5% free 8821K/9223K, paused 16ms+68ms, total 231ms
11-01 15:43:02.863: D/dalvikvm(712): GC_FOR_ALLOC freed 418K, 7% free 8800K/9415K, paused 73ms, total 76ms
11-01 15:43:02.883: I/Choreographer(712): Skipped 224 frames!  The application may be doing too much work on its main thread.
11-01 15:43:03.013: D/dalvikvm(712): GC_CONCURRENT freed 397K, 7% free 8804K/9415K, paused 74ms+6ms, total 113ms
11-01 15:43:03.013: D/dalvikvm(712): WAIT_FOR_CONCURRENT_GC blocked 33ms
11-01 15:43:03.063: D/dalvikvm(712): GC_FOR_ALLOC freed 386K, 7% free 8802K/9415K, paused 41ms, total 41ms
11-01 15:43:03.183: D/dalvikvm(712): GC_CONCURRENT freed 388K, 7% free 8806K/9415K, paused 75ms+7ms, total 119ms
11-01 15:43:03.183: D/dalvikvm(712): WAIT_FOR_CONCURRENT_GC blocked 35ms
11-01 15:43:03.243: D/dalvikvm(712): GC_FOR_ALLOC freed 378K, 7% free 8803K/9415K, paused 51ms, total 51ms
11-01 15:43:03.433: I/Choreographer(712): Skipped 142 frames!  The application may be doing too much work on its main thread.
comment:..... adding the 4. row to custom adapter and listview ..... 
11-01 15:36:31.662: I/Choreographer(712): Skipped 36 frames!  The application may be doing too much work on its main thread.
11-01 15:36:32.542: D/dalvikvm(712): GC_CONCURRENT freed 415K, 23% free 9057K/11719K, paused 18ms+15ms, total 139ms
11-01 15:36:32.554: D/dalvikvm(712): WAIT_FOR_CONCURRENT_GC blocked 123ms
11-01 15:36:32.613: D/dalvikvm(712): GC_FOR_ALLOC freed 492K, 23% free 9046K/11719K, paused 56ms, total 56ms
11-01 15:36:32.753: D/dalvikvm(712): GC_CONCURRENT freed 449K, 23% free 9078K/11719K, paused 76ms+7ms, total 134ms
11-01 15:36:32.753: D/dalvikvm(712): WAIT_FOR_CONCURRENT_GC blocked 48ms
11-01 15:36:32.813: D/dalvikvm(712): GC_FOR_ALLOC freed 514K, 23% free 9046K/11719K, paused 54ms, total 54ms
11-01 15:36:32.943: D/dalvikvm(712): GC_CONCURRENT freed 451K, 23% free 9078K/11719K, paused 76ms+8ms, total 128ms
11-01 15:36:32.943: D/dalvikvm(712): WAIT_FOR_CONCURRENT_GC blocked 44ms
11-01 15:36:33.013: D/dalvikvm(712): GC_FOR_ALLOC freed 516K, 23% free 9046K/11719K, paused 53ms, total 53ms
11-01 15:36:33.143: D/dalvikvm(712): GC_CONCURRENT freed 453K, 23% free 9078K/11719K, paused 75ms+9ms, total 127ms
11-01 15:36:33.143: D/dalvikvm(712): WAIT_FOR_CONCURRENT_GC blocked 41ms
11-01 15:36:33.193: D/dalvikvm(712): GC_FOR_ALLOC freed 518K, 23% free 9046K/11719K, paused 50ms, total 50ms
11-01 15:36:33.333: D/dalvikvm(712): GC_CONCURRENT freed 454K, 23% free 9078K/11719K, paused 75ms+8ms, total 137ms
11-01 15:36:33.333: D/dalvikvm(712): WAIT_FOR_CONCURRENT_GC blocked 59ms
11-01 15:36:33.393: D/dalvikvm(712): GC_FOR_ALLOC freed 520K, 23% free 9046K/11719K, paused 56ms, total 56ms
11-01 15:36:33.533: D/dalvikvm(712): GC_CONCURRENT freed 456K, 23% free 9079K/11719K, paused 75ms+8ms, total 129ms
11-01 15:36:33.533: D/dalvikvm(712): WAIT_FOR_CONCURRENT_GC blocked 52ms
comment:..... many of this .....
11-01 15:40:05.064: D/dalvikvm(712): GC_FOR_ALLOC freed 451K, 23% free 9135K/11719K, paused 97ms, total 97ms
11-01 15:40:05.204: D/dalvikvm(712): GC_CONCURRENT freed 451K, 23% free 9135K/11719K, paused 76ms+6ms, total 136ms
11-01 15:40:05.204: D/dalvikvm(712): WAIT_FOR_CONCURRENT_GC blocked 47ms
11-01 15:40:05.293: D/dalvikvm(712): GC_FOR_ALLOC freed 451K, 23% free 9135K/11719K, paused 66ms, total 66ms
11-01 15:40:05.443: D/dalvikvm(712): GC_CONCURRENT freed 451K, 23% free 9135K/11719K, paused 76ms+6ms, total 148ms
11-01 15:40:05.443: D/dalvikvm(712): WAIT_FOR_CONCURRENT_GC blocked 67ms
11-01 15:40:05.513: D/dalvikvm(712): GC_FOR_ALLOC freed 451K, 23% free 9135K/11719K, paused 59ms, total 59ms
11-01 15:40:05.643: D/dalvikvm(712): GC_CONCURRENT freed 451K, 23% free 9135K/11719K, paused 76ms+7ms, total 127ms
11-01 15:40:05.643: D/dalvikvm(712): WAIT_FOR_CONCURRENT_GC blocked 41ms
11-01 15:40:05.703: D/dalvikvm(712): GC_FOR_ALLOC freed 451K, 23% free 9135K/11719K, paused 56ms, total 56ms
11-01 15:40:05.833: D/dalvikvm(712): GC_CONCURRENT freed 451K, 23% free 9135K/11719K, paused 75ms+7ms, total 127ms
11-01 15:40:05.833: D/dalvikvm(712): WAIT_FOR_CONCURRENT_GC blocked 42ms
11-01 15:40:05.913: D/dalvikvm(712): GC_FOR_ALLOC freed 451K, 23% free 9135K/11719K, paused 63ms, total 63ms
11-01 15:40:06.114: D/dalvikvm(712): GC_CONCURRENT freed 451K, 23% free 9135K/11719K, paused 76ms+39ms, total 196ms
11-01 15:40:06.114: D/dalvikvm(712): WAIT_FOR_CONCURRENT_GC blocked 118ms
11-01 15:40:06.963: E/Trace(734): error opening trace file: No such file or directory (2)
11-01 15:40:07.953: D/gralloc_goldfish(734): Emulator without GPU emulation detected.

これが私の活動です:

package com.float.rezepte;

import java.io.File;
import java.util.ArrayList;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.RatingBar;
import android.widget.TextView;
import android.widget.Toast;

import com.actionbarsherlock.app.SherlockActivity;
import com.actionbarsherlock.view.Menu;
import com.actionbarsherlock.view.MenuItem;
import com.float.utilities.ImageProcessing;
import com.float.utilities.Utilities;

public class AddRecipeActivity extends SherlockActivity {

private EditText editTextName;
private EditText editTextDescription;
private EditText editTextDuration;
private EditText editTextPortions;
private EditText editTextPortionsUnit;
private RatingBar ratingBarDifficutly;
private ImageView imageViewPicture;
private static final int SELECT_PICTURE = 1;
private static final int TAKE_PICTURE = 2;
public boolean deletePicture = false;
private String selectedImagePath;
private byte[] recipePicture = null;
private Recipe recipe;
private ProgressDialog dialog;
private IngredientAdapter ingredientAdapter;
private ImageButton imageButtonAddIngredient;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_add_recipe);
    ConnectView();
    ArrayList<Ingredient> values;

    if (savedInstanceState != null)
    {
        recipe = savedInstanceState.getParcelable("recipe");
        editTextName.setText(recipe.getName());
        editTextDescription.setText(recipe.getDescription());
        editTextDuration.setText(String.valueOf(recipe.getDuration()));
        editTextPortions.setText(String.valueOf(recipe.getPortions()));
        editTextPortionsUnit.setText(recipe.getPortionsUnit());
        ratingBarDifficutly.setRating(recipe.getDifficulty());
        values = (ArrayList<Ingredient>) recipe.getIngredientList();
    }else{
        recipe = new Recipe();
        values = new ArrayList<Ingredient>();
    }

    ingredientAdapter = new IngredientAdapter(this, values); 
    final ListView listViewIngredients = (ListView) findViewById(R.id.listViewIngredients);
    listViewIngredients.setAdapter(ingredientAdapter);

    imageButtonAddIngredient.setOnClickListener(new OnClickListener(){
        @Override
        public void onClick(View v) {
            ingredientAdapter.addItem(new Ingredient());
            ingredientAdapter.notifyDataSetChanged();
            Utilities.setListViewHeightBasedOnChildren(listViewIngredients);
        }
    });

    final ViewTreeObserver observer = imageViewPicture.getViewTreeObserver();
       observer.addOnGlobalLayoutListener (new OnGlobalLayoutListener () {
            @Override
            public void onGlobalLayout() {          
                imageViewPicture.getViewTreeObserver().addOnGlobalLayoutListener(this);
                if(recipe.getPicture() != null){
                    imageViewPicture.setImageBitmap(ImageProcessing.scaleImage(recipe.getPicture(), imageViewPicture.getWidth(), imageViewPicture.getHeight()));
                }
            }
        });
}

private void ConnectView(){
    editTextName = (EditText) findViewById(R.id.editTextName);
    editTextDescription = (EditText) findViewById(R.id.editTextDescription);
    editTextDuration = (EditText) findViewById(R.id.editTextDuration);
    editTextPortions = (EditText) findViewById(R.id.editTextPortions);
    editTextPortionsUnit = (EditText) findViewById(R.id.editTextPortionsUnit);
    ratingBarDifficutly = (RatingBar) findViewById(R.id.ratingBarDifficulty);
    imageViewPicture = (ImageView) findViewById(R.id.imageViewPicture);
    imageButtonAddIngredient = (ImageButton) findViewById(R.id.imageButtonAddIngredient);
}

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
  super.onSaveInstanceState(savedInstanceState);
  savedInstanceState.putParcelable("recipe", copyUserInputToRecipe());
}

private Recipe copyUserInputToRecipe(){
    recipe.setName(editTextName.getText().toString());
    recipe.setDescription(editTextDescription.getText().toString());
    recipe.setDifficulty(ratingBarDifficutly.getRating());
    if(!editTextDuration.getText().toString().equals("")){
        recipe.setDuration(Integer.parseInt(editTextDuration.getText().toString()));
    }
    if(!editTextPortions.getText().toString().equals("")){
        recipe.setPortions(Integer.parseInt(editTextPortions.getText().toString()));
    }
    recipe.setPortionsUnit(editTextPortionsUnit.getText().toString());
    if(recipePicture != null){
        recipe.setPicture(recipePicture);
    }
    return recipe;
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getSupportMenuInflater().inflate(R.menu.activity_add_recipe, menu);
    return true;
}

@Override
public void onBackPressed() {
    super.onBackPressed();
    overridePendingTransition(android.R.anim.fade_in,
            android.R.anim.fade_out);
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case R.id.menu_cancel_recipe:
        finish();
        break;
    case R.id.menu_save_recipe:
            Intent returnIntent = new Intent();
            returnIntent.putExtra("recipe", recipe);
            setResult(RESULT_OK, returnIntent);
            finish();

        break;
    }
    return super.onOptionsItemSelected(item);
}
}

編集:ViewTreeObserverが問題です。それを取り除いた後、フリーズは発生しませんでした。

4

4 に答える 4

1

2つのこと:

  1. アダプターでの addItem メソッドの実装はスレッド保存ではありません。同期させます。また、 getView メソッドに data.remove(...) 呼び出しがあります-これもスレッドセーフでない方法で行われます。

  2. 対応するテキストが変更されたときに、 Ingredient オブジェクトを変更します。Ingredient クラスの実装で、関連する EditText コンポーネントのコンテンツも変更しますか? その場合、editText.setText(...) が呼び出されるたびに TextWatcher が呼び出される無限ループに入ります。SGS 3 はクアッド コア CPU デバイスであるため、最大 4 つのスレッドをリアルタイムで処理できます (1 つは永続的な UI 用で、残りの 3 は残します)。

これらの点に対処し、状況の尾をつかむことができるかどうかを確認してください. 操作の重さは、SGS 3 にとっては大したことではありません。対処するのに十分な力があります。

お役に立てれば。

于 2012-11-01T23:25:12.570 に答える
0

したがって、デバイスの向きが変わったときに再利用するために画像バイトを保存します...

オーバーライドすることで、デバイスの向きの変化を検出できます

    onConfigurationChanged(Configuration newConfig) 

あなたの活動の方法。http://developer.android.com/reference/android/app/Activity.html#onConfigurationChanged(android.content.res.Configuration)で読む

http://developer.android.com/reference/android/content/res/Configuration.html

必ず指定してください

    android:configChanges="orientation" 

そのアクティビティのマニフェストエントリ。これにより、デバイスが縦向きか横向きかを検出できます。最も重要なことは、これはデバイスの向きが変更されたときにのみトリガーされます(画面上のわずかな変更ごとに起動するグローバルレイアウトリスナーとは異なります)。

これがお役に立てば幸いです。

于 2012-11-13T02:34:23.533 に答える
0

私が推測しなければならなかったのは、アダプターメソッド内にテキストウォッチャークラスがあり、さらに重要なことに、テキストリスナーがあるようgetView()です。したがって、各行のクラスを作成し、各行を常に同時にリッスンしていると想定しています。テキストウォッチャーが本質的に行う場合、行数によっては多くのリソースが必要になる場合があります。別の方法で実装する方法を見つける必要があります。おそらく、アダプターの外部でセットアップを行うか(安全のために)、コンストラクターを動作させるか、アダプターに何らかの方法で実装させます。または私がすること-選択した行のビューのみをリッスンします。選択を解除するとオフになります。試してみる価値。

編集:たくさんの方法があります。しかし、最も簡単なのは、聞きたいものごとにBaseAdapterタグを設定し、 (問題が発生した場合) タグがその位置に一致する場合にアクションを実行することだと思います。しかし、これがなくてもうまく機能する場合、これはすべて不要かもしれません。私たちが知っている限りでは、リスナーのメソッドはすでに十分に最適化されています。その時は別の説明が思いつかなかったというだけです。positiononFocusChangedOnClick

于 2012-11-01T22:39:49.313 に答える