rainit2006 / Android-

记录一下Android基本知识
0 stars 0 forks source link

my summary #12

Open rainit2006 opened 7 years ago

rainit2006 commented 7 years ago
rainit2006 commented 7 years ago

CrazyCat

Object#clone() Javaの全てのクラスの親であるObjectクラスには、clone()という、複製を作成するメソッドが用意されている。 ただしこのメソッドはprotectedなので、サブクラスでオーバーライドしてpublicにしてやらないと、外部から呼び出すことが出来ない。

public class Sample implements Cloneable {
    @Override
    public Object clone() { //throwsを無くす
        try {
            return **super.clone**();
        } catch (CloneNotSupportedException e) {
            throw new InternalError(e.toString());
        }
    }
}

textはStringBuffer型という参照型。cloneだと、textはDeepCopyできない。

http://www.creative-forest.com/java/java_tips/oop/shallow_deep/shallow_deep.html

シリアライズによる複製

/**
      * 符号化により複製を生成可能なUserクラス。
      *
      */
     class User implements Serializable { // ← Serializableをimplementsする
 
         /** ID */
         private int id;
 
         /** 名前 */
         private String name; // StringはSerializableをimplementsしている
 
         /** お誕生日 */
         private Date birthDate; // DateはSerializableをimplementsしている
 
         // ~~ 省略 ~~
     }

 User maekawa = new User(1, "前川", birthDate);
     User cloneMaekawa = (User) SerializeUtils.deepCopy(maekawa);

もう一つ詳細のサイト: http://www.avajava.com/tutorials/lessons/how-do-i-perform-a-deep-clone-using-serializable.html

Dialog類はactivityを生成したメインスレッド(?)でしか生成できません。 なので、Viewで作って表示する場合はActivityを経由して、Activityが作ったように見せかける必要があります。そこで使われるのが Handleです。

public class MyActivity extends Activity 
{ 
  private Handler mHandler = new Handler(); 
  @Override 
  public void onCreate(Bundle savedInstanceState) 
  { 
    super.onCreate(savedInstanceState); 
    setContentView(new MyView(this)); 
  } 
  public void PostRunnable(final Runnable run) 
  { 
    mHandler.post(run); 
  } 
} 

public class MyView extends SurfaceView 
{ 
  private MyActivity mActivity = null; 
  public MyView( Context context ) 
  { 
    super( context ); 
    mActivity = (MyActivity)context; 
  } 
  void showDialog() 
  { 
    mActivity.PostRunnable(new Runnable(){ 
        @Override public void run(){ 
          //ダイアログの作成&表示 
        } 
    ); 
  } 
}