Androidアクティビティ間の受け渡しについて

このQ&Aのポイント
  • Androidアクティビティ間の受け渡しについての質問
  • 現在、あるアクティビティで作成したSocketクラスを継承したオブジェクトを別のアクティビティに受け渡そうとしています。しかし、受け取った先のアクティビティでソケットの接続状態が変わってしまうという問題が発生しています。原因がわかる方にご教示いただきたいです。
  • 質問者は、Socketクラスを継承したオブジェクトをアクティビティ間で受け渡そうとしていますが、受け取った先のアクティビティでソケットの接続状態が変わってしまうという問題が発生しています。Serializableを使ってオブジェクトを渡しているが、なぜ接続状態が変わってしまうのか原因がわからないとのことです。
回答を見る
  • ベストアンサー

Android アクティビティ間の受け渡しについて

現在、あるアクティビティで作成したSocketクラスを継承したオブジェクトを 別のアクティビティに受け渡そうとしています。 このとき受け取った先のアクティビティで ソケットの接続状態が変わってしまい、困っています。 原因がわかるかたおりましたら教えてください。よろしくお願いします。 ---- 手順 1.Serializableを実装したSocket継承クラス(Socket2)を作成  (Socketオブジェクトをアクティビティに渡すために必要)   class Socket2 extends Socket implements Serializable 2.アクティビティAでホストXXXとの接続を確立 Socket2 socket = new Socket2(); Socket2.connect(XXX); ★ここでsocketの属性IsConnectedを見るとTrueになっています 3.インテント作成 Intent intent = new Intent(context, ActivityB.class); 4.パラメータ設定 intent.putExtra("SOCKET", socket); 5.アクティビティBを起動 StartActivity(intent); ; 6.アクティビティBのOnCreate()でパラメータを取得 Bundle extras = getIntent().getExtras(); if(extras != null){    socket = (Socket2)extras.getSerializable("SOCKET"); } ★ここでsocketの属性IsConnectedを見るとFalseになっています 変数socket自体はnullではないので何か値は渡ってきてはいるのですが 接続が切れているため、たとえば socket.getInputStream()等をすると例外(IOException)が飛んできます。 またSocket2クラスに文字列の属性を追加した場合には、 その値は正しく渡せているようです。 Serializableを実装すればオブジェクトもアクティビティに渡せるということなので その通りにやったつもりなのですが・・・。 なぜこうなってしまうのか原因がわかりません。 よろしくお願いします。

  • Java
  • 回答数1
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • koko_u_u
  • ベストアンサー率18% (216/1139)
回答No.1

このへんかな? http://d.hatena.ne.jp/daisuke-m/20100414/1271228333 要するに、implements Serializable と書けばいいということではないよ、ということ。

kiyokiyo23
質問者

お礼

回答ありがとうございます。ご紹介いただいたページを読みました。 Serializable についてよく理解することができました。 どうもプリミティブなフィールド以外はシリアライズは困難なようですね。 調べている時にわかった事ですが 「復元(読み込み)されるときスーパークラスがシリアライズ可能でない場合は、  そのデフォルトコンストラクターは呼ばれる。 「シリアライズ対象クラスがSerializableを実装しているのにスーパークラスが  Serializableを実装していない場合、スーパークラスが持っている変数の内容は  転送されない」 という事がわかりました。 つまり、転送しようとしているSocket2の親クラスSocketがSerializableを 実装していないので、SocketのデフォルトコンストラクターSocket()が復元されていたため IsConnedted=Falseという初期値が入っていた、 ということだということで、今回の原因がわかりました。 さて、では実際にSocketを親クラスに持つクラスのシリアライズの方法ですが・・・ とても難しそうでわかりません><

関連するQ&A

  • VB2008: 継承の場合のコンストラクタの書き方?

    ' ================================================================== ' クラス TEST1 ' ================================================================== <Serializable()> Public Class TEST1   Private _Member1 As String   Private _Member2 As String   ' //   ' // パラメータを持つ初期化   ' //   Public Sub New(ByVal aMember1 As String, ByVal aMember2 As String)     _Member1 = aMember1     _Member2 = aMember2   End Sub End Class ' =========================== ' クラス TEST1 の派生クラス ' =========================== <Serializable()> Public Class NEWTEST1 Inherits TEST1 Private _Member1 As New TEST1 Private _Member2 As New TEST1 End Class これでもOKかと思うのですが・・・。 パラメータ化されていないコンストラクタをクラス TEST1 に書くように促すエラーがでます。 もちろん、パラメータを持たないコンストラクタを用意すればエラーは回避できます。 問題は、「Visual Basic のプログラミングガイド」からその理由を読み取れないことです。 >Visual Basic のオブジェクトの概要 >クラスについて >オブジェクトの作成と使用 まだ、ここしか読んでいません。 が、どうにも気になったので質問します。 1、エラーの回避策としては何が正しいのか? 2、その根拠は? この2つが知りたいです。

  • c# この高速化の方法あり? 2

     こんにちは、c#初心者です。  現在ライブラリを作成しているのですが、その中でちょっと問題がありそうな高速化の方法を思いついたので質問させていただきました。  継承させるクラスを作るときに、継承予定のクラスで実装するメソッドやメンバを、基のクラスでは public class Class1 {   internal virtual void Method()   {     throw new NotImplementedException();   } } // - - - - - - - - - - - - - - - - - - - - - - - - - public class Class2 {   internal override void Method()   {     //ここで実装   } } として、 このオブジェクト「sampleObj」があったとして、 if ( sampleObj is Class2 )   sampleObj.Method(); のようにすることで Class2 temp = sampleObj as Class2; if ( temp != null )   temp.Method(); や if ( sampleObj is Class2 )   ((Class2)sampleObj).Method(); のようにすることよりも若干高速になるようです。  末端のアプリケーションならまだ問題になりにくいかもしれませんが、今回はライブラリということなので気になっています。  気休め程度に「internal」になっていますがそれでもまずい気がします。  どなたか詳しい方がいらっしゃいましたら教えていただけませんか?

  • androidのintentの使い方

    // //問題:LISTを押すと、エラーが出る、Intentの問題ですか? // public class FirstActivity extends Activity { // onCreateメソッド(画面初期表示イベントハンドラ) private static final String TAG ="[HelloWorld]"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);// スーパークラスのonCreateメソッド呼び出し setContentView(R.layout.firstlayout);// レイアウト設定ファイルの指定 ListView listview = (ListView) findViewById(R.id.fruitlist); // ListViewオブジェクト取得 listview.setOnItemClickListener(new ListItemClickListener()); // ListViewオブジェクトにクリックリスナーを関連付け } // アイテムクリックリスナー定義 class ListItemClickListener implements OnItemClickListener { public void onItemClick(AdapterView<?> parent, View view, int position, long id) {// onItemClickメソッド(値選択時イベントハンドラ) ListView listview = (ListView) parent; // ListViewオブジェクト取得 String item = (String) listview.getItemAtPosition(position);// 選択された値取得 Log.d(item, TAG); Intent intent = new Intent(FirstActivity.this,SecondActivity.class);// インテントの生成(呼び出すクラスの指定) startActivity(intent);// 次のアクティビティの起動 } } } -------------------------------------------------------------------------- public class SecondActivity extends Activity { // onCreateメソッド(画面初期表示イベントハンドラ) @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // スーパークラスのonCreateメソッド呼び出し setContentView(R.layout.main);// レイアウト設定ファイルの指定 } }

    • ベストアンサー
    • Java
  • 〔C#〕WPFのディープコピーをするには?

    オブジェクトのディープコピーは、以下のURLを参考にして作成しました。 http://d.hatena.ne.jp/tekk/20100131/1264913887 WPF(UserControl)で作成したViewに対して上記URLのDeepCopy()関数を実行すると、 実行時に次のエラーが出てしまいます。 「'System.Windows.UserControl'はシリアル化可能として設定されていません。」 調べますと、Sezializable属性を付ければ良いとあるのですが、 該当のWPF(xaml)のcsファイル(XXX.xaml.cs)のクラスの宣言の上に以下のように付けましたが、 変わらずエラーが出てしまいます。 [Serializable] public partical class XXX { ・・・ どのようにしたら、上記のエラーを解決し、Viewのディープコピーができるのでしょうか? とても困っています。 ご教授よろしくお願いいたします。

  • C++で参照カウンタを実装したいのですが

    こんにちは。 C++でクラスに参照カウンタを実装したいのですが、もしも実装する場合、 class CRefCounter {   参照カウンタとAddRef、Releaseメソッドを仮想メソッドとして実装 }; このクラスを継承して直接使う方法と、 class IRefCounter {   参照カウンタとAddRef、Releaseメソッドを純粋仮想メソッドとして宣言 } このクラスを継承して継承側で実装する方法とがあると思うのですが普通はどちらを使うものでしょうか?

  • オブジェクトの解放をするには?(JBuilder8)

    パネルを継承したクラスを作り、それを使ってオブジェクトを作りました。下記のように・・・ *** public class newPanel extends Panel{ *** newPanel pnl = new newPanel(); *** でこの"pnl"をあるタイミングで解放して取り直したいのですが解放には"pnl"に"null"をいれれば良いのでしょうか?

    • ベストアンサー
    • Java
  • 抽象クラスが継承されているかどうか検証したい

    Class.forName()にて取得したクラスが、特定の抽象クラスを継承しているかどうかを 検証したいです。 Class.getInterfaces()にて、実装されているインターフェースを取得することが出来ましたが、 Class.getClasses()、Class.getDeclareClasses()のいずれでも、継承されている 抽象クラスを取得することが出来ません。 そもそも抽象クラスはインスタンス化できないからなのかもしれませんが、 ならば、その抽象クラス名称を取得したいです。 方法はありますでしょうか? 無理ならばインターフェースの実装にし、基盤部で動作のカバーを する作りで考え直すつもりです。

    • ベストアンサー
    • Java
  • クラス作成

    C#にてクラス作成をしております。その中で疑問に思った点を質問させていただきます。 画像を枠内に表示させるクラス 実装すべき変数:枠番号、パス、 映像を枠内に流すクラス 実装すべき変数:枠番号、パス、再生時間 Flashを枠内に流すクラス 実装すべき変数:枠番号、パス など色々なクラスがあってそれをまとめたクラスを作成中です。 上記のクラスを実装するにあたって、共通の変数はクラスにしてしまい それを継承しましょうと言う指示がありました。これはどういった使い方をするものなのでしょうか? class Class2 { public int no { get; set; } public string path { get; set; } } class Movie : Class2 {    public float time{get;set;} public void Play(int frameNo, string path, float playtime){} } class Picture: Class2 {    public void Show(int frameNo, string path){} } これをForm1.cs内で Class2 cls = new Class2(); cls.path = "C:\\test"; cls.no = 11; とかすれば MovieやPictureで使いまわしができると思いきや MovieやPictureをNewすれば初期化されてしまう為、何か根本的に 私の考えが間違ってると思います。 共通の変数を別のクラスにしておいて継承して使うというのはどういった使い方をするのでしょうか? よろしければ例で教えていただけないでしょうか

  • サブクラス型オブジェクトをスーパークラス方に代入

    ある所で下記のような継承についての記述をみつけました。 ----------------------------------------------------------------------------- 継承の目的は、あるクラスで実装したメソッドなどの機能を利用して、 さらに実装を追加する差分コーディングです。 一つのクラスから複数のサブクラスを作ることも良くあります。 このような時、それらのサブクラス型オブジェクトの参照を代入できる変数として、 スーパークラス型変数を使うことがしばしばあります。 ----------------------------------------------------------------------------- サブクラス型オブジェクトの参照を代入できる変数として、 スーパークラス型変数を使うことがある、と いうのはどういった場合に使うのでしょうか。 よろしくお願いします。

    • ベストアンサー
    • Java
  • androidアプリが強制終了してしまいます。

    オプションメニューボタンの「MENU_ITEM0」を押すと、他の機能が呼び出されずに強制終了でエラーになってしまいます。 ・呼び出すソースファイルです。 「public class CogoterActivity extends Activity { //メニューアイテムID private static final int MENU_ITEM0=0, MENU_ITEM1=1; //アクティビティ起動時に呼ばれる @Override public void onCreate(Bundle bundle) { super.onCreate(bundle); requestWindowFeature(Window.FEATURE_NO_TITLE); //リスト要素の情報群の生成 List<ListItem> items=new ArrayList<ListItem>(); for (int i=0;i<50;i++) { items.add(new ListItem(res2bmp(this,R.drawable.icon),"項目"+i)); } //リストビューの設定 ListView listView=new ListView(this); listView.setScrollingCacheEnabled(false); listView.setAdapter(new ListAdapter(this,items)); setContentView(listView); new TextView(this); } public boolean onCreateOptionsMenu(Menu menu) { super.onCreateOptionsMenu(menu); //メニューアイテム0の追加 MenuItem item0=menu.add(0,MENU_ITEM0,0,"ぶつぶつ"); item0.setIcon(android.R.drawable.ic_menu_edit); //メニューアイテム1の追加 MenuItem item1=menu.add(0,MENU_ITEM1,0,"ぶくぶく"); item1.setIcon(android.R.drawable.ic_menu_more); return true; } //メニューアイテム選択イベントの処理 @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case MENU_ITEM0: Intent intent = new Intent(this, cogoter.project.MyActivity.class); startActivity(intent); return true; case MENU_ITEM1: showDialog(this,"","ぶくぶくを押した"); return true; } return true; } //ダイアログの表示 private static void showDialog(Context context,String title,String text) { AlertDialog.Builder ad=new AlertDialog.Builder(context); ad.setTitle(title); ad.setMessage(text); ad.setPositiveButton("OK",null); ad.show(); } //リソース→ビットマップ public static Bitmap res2bmp(Context context,int resID) { return BitmapFactory.decodeResource( context.getResources(),resID); } }」 ・呼び出されるソースコード 「public class MyActivity extends Activity implements View.OnClickListener { private final static int WC=LinearLayout.LayoutParams.WRAP_CONTENT; private final static int FP=LinearLayout.LayoutParams.FILL_PARENT; private EditText editText;//エディットテキスト //アクティビティ起動時に呼ばれる @Override public void onCreate(Bundle bundle) { super.onCreate(bundle); requestWindowFeature(Window.FEATURE_NO_TITLE); //戻り値の指定(6) setResult(Activity.RESULT_CANCELED); //インテントからのパラメータ取得(5) String text=""; Bundle extras=getIntent().getExtras(); if (extras!=null) text=extras.getString("text"); //レイアウトの生成 LinearLayout layout=new LinearLayout(this); layout.setBackgroundColor(Color.rgb(255,255,255)); layout.setOrientation(LinearLayout.VERTICAL); setContentView(layout); //OKボタンの生成 Button button=new Button(this); button.setText("OK"); button.setOnClickListener(this); button.setLayoutParams(new LinearLayout.LayoutParams(WC,WC)); layout.addView(button); //エディットテキストの生成 editText=new EditText(this); editText.setText(text); editText.setLayoutParams(new LinearLayout.LayoutParams(FP,WC)); layout.addView(editText); } //ボタンクリック時に呼ばれる public void onClick(View v) { //戻り値の指定(6) Intent intent =new Intent(); intent.putExtra("text",editText.getText().toString()); setResult(Activity.RESULT_OK,intent); //アクティビティの終了(7) finish(); } }」

専門家に質問してみよう