0

私は主な活動で次の機能を実行します

 @Override
 public void onDestroy() {
 super.onDestroy();
 SimpleBookManager.getSimpleBookManager().saveChanges(this);  
}

Android が後でメソッド関数 saveChanges() を呼び出してアプリケーションを閉じると、「SaveChanges」アウトプリントが取得されますが、最後の「保存後」の出力は取得されません。これは、関数全体が実行されておらず、キャッチで outPrints が取得されていないことを意味します。例外行のいずれか。なぜなのかご存知ですか?私はアンドロイドが初めてで、このコード onDestroy() を実行できるかどうかわかりません。=)

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.content.Context;

public class SimpleBookManager implements BookManager, java.io.Serializable {

    private ArrayList<Book> allBooks = new ArrayList<Book>();
    private static SimpleBookManager ref;       


    public void saveChanges(Context context){
        try{
            System.out.println("SaveChanges");
            FileOutputStream f_out = context.openFileOutput("myobject.data",Context.MODE_PRIVATE);

            // Write object with ObjectOutputStream
            ObjectOutputStream obj_out = new    ObjectOutputStream (f_out);
        // Write object out to disk
        obj_out.writeObject(allBooks);
        System.out.println("After Saving");

    }catch (FileNotFoundException e) {
        System.out.println("No file found saveChanges");
    } catch (IOException e) {
        System.out.println("IOException in SaveChanges");
    }   
}




public void loadBooks(Context context){
    try{
    // Read from disk using FileInputStream
        FileInputStream f_in = context.openFileInput("myobject.data");

    // Read object using ObjectInputStream
    ObjectInputStream obj_in =  new ObjectInputStream (f_in);

    // Read an object
    Object obj = obj_in.readObject();
    //System.out.println(obj);
    if (obj instanceof ArrayList<?>)
    {
        allBooks = (ArrayList<Book>) obj;

        System.out.println("Worked");
        System.out.println(allBooks);

    }
    }catch (FileNotFoundException e) {
        System.out.println("No file found LoadBooks");
    } catch (IOException e) {


    System.out.println("IOException in loadBooks");
    } 
    catch (ClassNotFoundException e) {
        System.out.println("ClassNotFound in loadBooks");
    }

}

  public static SimpleBookManager getSimpleBookManager()
  {
    if (ref == null){
        ref = new SimpleBookManager();
    }

    return ref;
  }
public SimpleBookManager(){
    Book book1 = createBook();
    book1.setAuthor("RandomBookAuthor");
    book1.setCourse("Kunskap");
    book1.setPrice(199);
    book1.setTitle("Some Random Title");
    book1.setIsbn("9780590353403");
}   

}

また、この onCreate() をメインで実行すると IOException が発生するため、ロード関数と保存関数について何か怪しいものがあります。

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        SimpleBookManager.getSimpleBookManager().loadBooks(this);
        setContentView(R.layout.activity_action_bar_main);
}

_ _ _ _ _ _ _ _ _ _ _ _ __ _ _ _ _ _ _ _ _ _ __ _ _ _ __ _ _ __ _ _ _ _ _ _ _ _ _ _ _ _ _ __ _ _ _ _ _ _ _ _ _ _ _

以下のマニフェストの最後の行で、ストレージに書き込む権限をマニフェストに追加しました。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.av.BookApp"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="11"
        android:targetSdkVersion="16" />

    <application
        android:icon="@drawable/ic_launcher"

        >
        <activity
            android:name=".BookApp"
            android:label="@string/title_bookapp"
            android:uiOptions="splitActionBarWhenNarrow" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
            <activity
        android:name=".AddBookActivity"
        android:uiOptions="splitActionBarWhenNarrow" >
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="edu.chalmers.BookApp" />
    </activity>
     <activity
        android:name=".DetailActivity"
        android:uiOptions="splitActionBarWhenNarrow" >
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="edu.chalmers.BookApp" />
    </activity>
     <activity
        android:name=".EditBookActivity"
        android:uiOptions="splitActionBarWhenNarrow" >
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="edu.chalmers.BookApp" />
    </activity>

    </application>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
</manifest>

編集

以下のアドバイスに従った後、saveChanges() で IOException が発生するようになりました

そして、私はこのようにデータを正しく設定します(SimpleBookManagerで)

public SimpleBookManager(){
Book book1 = createBook();
    book1.setAuthor("RandomBookAuthor");
    book1.setCourse("Kunskap");
    book1.setPrice(199);
    book1.setTitle("Some Random Title");
    book1.setIsbn("9780590353403");
}
4

2 に答える 2

0

onCreate()メソッドを並べ替える

 @Override
 public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_action_bar_main);
    SimpleBookManager.getSimpleBookManager().loadBooks(this);
 }

メソッドをオーバーライドonStop()し、メソッドをオーバーライドしないonDestroy:

 @Override
 public void onStop() {
    super.onStop();
    SimpleBookManager.getSimpleBookManager().saveChanges(this);  
 }
于 2012-11-18T13:41:01.657 に答える
0

データを onResume メソッドに保存すると、システムがプロセスを強制終了する前にアクションを実行することが保証されると思います

于 2012-11-18T13:06:52.457 に答える