1

ボタンを押すと XML ファイルをダウンロードし、その xml データをカスタム オブジェクトに入れ、それを 2 番目のアクティビティに渡すアプリを開発しています。
問題は、何かが間違っていることです。startActivity()関数を呼び出すと、アプリがランタイム エラーでクラッシュします。私のコードは次のとおりです。

public void onClickBtn1(View view)
{
    final ProgressDialog dlg = ProgressDialog.show( this, "Data wait", "Waiting data from the site ..");

    // Thread to wait data
    Thread th = new Thread() {

        public void run() {

            // Download and parse xml data
            final DatiSport dati = new DatiSport();
            boolean ret = dati.download();
            dlg.dismiss();

            // check result
            if (ret==true)
            {
                // -- Ok
                handlerUI.post( new Runnable() {

                    public void run() {
                        Intent intSec = new Intent(AICSActivity.this, SportActivity.class);
                        intSec.putExtra("datiSport", dati);
                        startActivity(intSec);
                    }
                });
            }
            else
            {

通話中にアプリがクラッシュしstartActivity()ます。行を改行するstartActivity()と、「dati」という変数を見ることができず、これが明確に定義されていないと思います。
データを 12345 に置き換えれば問題ありません。

データの問題はどれですか?


--- 自分で返信できないため、ここで変更 ---

わかりました。返信ありがとうございます。
私の推測では、アプリ データを再設計する必要があります。

私の最初の試みは、XML テキストをダウンロードし、データを (むしろ) 複雑なオブジェクトに収めることでした。このオブジェクトには選手権のリストが含まれ、それぞれにカテゴリのリストが含まれ、それぞれにチームのリストが含まれます。

問題は、Serializable が機能していないため、Parcelable の実装が複雑すぎて、xml ファイルとほぼ同じデータを生成する必要があることです。
XMLテキストを他のアクティビティに直接渡す方が簡単かどうか疑問に思っています(チャンピオンシップのリスト、選択したチャンピオンシップのカテゴリ、選択したカテゴリのチームのリストを順番に表示する必要があります...)

他のアイデアはありますか?

4

5 に答える 5

1

この回答からの抜粋:

Serializable標準の Java インターフェイスです。インターフェイスを実装してクラス Serializable をマークするだけで、Java は特定の状況でそれを自動的にシリアライズします。

Parcelableシリアル化を自分で実装する Android 固有のインターフェイスです。これは、Serializable よりもはるかに効率的であり、デフォルトの Java シリアライゼーション スキームの問題を回避するために作成されました。

この回答からの抜粋:

Parcelable を見て、なぜ Android は組み込みの Java シリアライゼーション メカニズムを使用しないのかという疑問が生じたかもしれません。Android チームは、Java でのシリアル化は Android のプロセス間通信の要件を満たすには遅すぎるという結論に達したことが判明しました。そこで、チームは Parcelable ソリューションを構築しました。Parcelable アプローチでは、クラスのメンバーを明示的にシリアル化する必要がありますが、最終的には、オブジェクトのシリアル化がはるかに高速になります。

StackOverFlow に関するいくつかの回答を見た後、Parcelable は Android のシリアライゼーションよりも最適化されているという結論に達しました。

クラスをParcelableにする方法は?? (これこれ、およびこのチュートリアルをチェックしてください)

于 2012-08-17T17:24:32.210 に答える
0

オブジェクトを渡すときに Serializable または Parcelable を使用する

Serializable クラスを実装するにはクラスが必要です

//to pass :
intent.putExtra("MyClass", obj);  

// to retrieve object in second Activity
getIntent().getSerializableExtra("MyClass");

クラスは次のようになります。

import java.io.Serializable;

@SuppressWarnings("serial") //with this annotation we are going to hide compiler warning
public class MyClass implements Serializable {

public Deneme(Object obj){
    this.obj= obj;
}
private Object obj;

}
于 2012-08-17T17:05:13.113 に答える
0

クラスにSerializableインターフェイスを実装してから、オブジェクト インスタンスをインテント extraに渡します。

あるアクティビティから別のアクティビティにデータを渡すには:

intent.putExtra("ClassName", obj); 

First Activity から Second Activity のデータを取得するには:

getIntent().getSerializableExtra("ClassName");
于 2012-08-17T17:23:54.310 に答える
0

Intent クラスには次のメソッドがあります。

putExtra(String name, int value)

そのため、「値」の場所に 12345 を配置すると機能しますが、「DatiSport」オブジェクトを取るオーバーロードされたバージョンの putExtra はありません。「DatiSport」がシリアライズ可能またはパーセル可能であることを確認する必要があります。

詳細については、以下を参照してください。

http://developer.android.com/reference/android/content/Intent.html#putExtra%28java.lang.String,%20java.io.Serializable%29

インテントを使用して、ある Android アクティビティから別の Android アクティビティにオブジェクトを送信する方法は?

Android であるアクティビティから別のアクティビティにオブジェクトを渡す方法

于 2012-08-17T17:13:22.567 に答える
0

問題が見つかりました!!!
内部クラスは Serializable を実装していませんでした!
ダンプ ウィンドウに、NotSerializable エラーが発生したことを示す内部オブジェクト 'ioe' とクラスの名前が表示されました!!
ここで、各内部クラスをチェックし、データが次のアクティビティに渡されます。

どうもありがとう

于 2012-08-20T20:23:19.523 に答える