0

今日はほぼ一日中これを理解しようとしていますが、正しく理解できないようです。File-Output/Input-Streamの使用方法を理解しています。ただし、ArrayListは「int」ではないため、ArrayListを渡すことはできません。「シリアル化」によってArrayListがバイトに変換され、File-Output/Input-Streamを介して操作できることがわかりました。しかし、それがどのように機能するのか理解できません。「Object-Input/Output-Stream」コードを他の誰かから盗んだのですが、その人は私と同じ目標を狙っているように見えましたが、うまくいきません。Android Dev Docsでシリアル化を見てきましたが、それがどのように機能するかを正確に理解することはできません。

誰かお願いできますか。

A)シリアル化がどのように機能するか、および/またはそれを実行する方法をより簡単な言葉で説明しますか?

B)以下のコードが機能しない理由を説明してください(たとえば、すべてのObject(in / out)putStreamを追加する前に、コードが動的かつリアルタイムでリストビューに入力されましたが、ボタンがプッシュ、NORは何かをロードしません、NORはエラーをスローしません)。

また

C)永続データになるようにこのArrayListを保存する簡単な方法はありますか。

package com.example.thepicker;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ListView;

public class Settings extends Activity implements OnClickListener{


    EditText getit;
    ImageButton giveit;
    ListView thelist;
    ArrayList<String> items;
    ArrayAdapter<String> list;
    Intent pass;
    FileOutputStream persistout;
    FileInputStream persistin;
    ObjectOutputStream osistout;
    ObjectInputStream osistin;

    @SuppressWarnings("unchecked")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.settings);

        items = new ArrayList<String>();
        list = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,items);
        pass = new Intent(this,Main.class);
        getit = (EditText) findViewById(R.id.getit);
        giveit = (ImageButton) findViewById(R.id.giveit);
        thelist = (ListView) findViewById(R.id.thelist);


        try {
                persistin = openFileInput("FILENAME");
                osistin = new ObjectInputStream(persistin);
                items = (ArrayList<String>) osistin.readObject();
                osistin.close();
                persistin.close();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }



        thelist.setAdapter(list);
        list.notifyDataSetChanged();
        giveit.setOnClickListener(this);
    }

    @Override
    public void onPause() {
        super.onPause();

        pass.putExtra("total", items);  
        this.startActivity(pass);

        try {
            persistout = openFileOutput("FILENAME", Context.MODE_PRIVATE);
            osistout = new ObjectOutputStream(persistout);
            osistout.writeObject(items);
            osistout.close();
            persistout.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }


}



    @Override
    public void onClick(View v) {
    items.add(getit.getText().toString());
    list.notifyDataSetChanged();
}

}
4

1 に答える 1

1

A) シリアル化はあなたの問題ではありません。私が知る限り、あなたはそれを「正しく」やっています。シリアライゼーションの代わりに sqlite を使用することを強くお勧めしますが、それは私が db マニアだからです。

B) 上に向かってリストを作成している

アイテム = 新しい ArrayList();

次に、そのリストを使用してアダプターを作成します。変数参照です。アダプターを作成した後、リストを逆シリアル化します。アダプタには、作成した他のリストへの参照があります。あなたのアイテム VARIABLE は完全に別のリストを指しています。逆シリアル化した後にアダプターを初期化すると、機能するはずです。

C)「より簡単」かどうかはわかりませんが、sqliteの方が「優れています」。

ただし、設計には大きなシステム上の問題があります。メインスレッドであらゆる種類の I/O を実行していますが、これはノーノーです。onCreate を読み込んでいますが、onPause に保存しています。これは機能するはずですが、バランスが取れていません (onCreate の陽は onDestroy です。onResume は onPause と一緒です)。うまくいかないわけではありませんが、奇妙です。

List var をローカルに保持するのも奇妙に感じますが、Android コードを見ると、(現在のように) 再定義しない限り、リスト内の参照は同じであるはずです。

于 2013-03-17T02:42:02.300 に答える