2013-04-05 2 views
1

Parcelable을 구현하는 클래스가 있으며 수정할 수없는 몇 가지 기본 Android 클래스가 포함되어 있으므로 Serializable을 구현할 수 없습니다.Parcelable 데이터 저장

이 클래스의 객체 중 일부는 Location 및 PendingIntent (모두 편리하게 Parcelable 임)입니다.

내 문제는 내 주요 활동의 인스턴스간에이 정보를 저장하고 있습니다.

현재이 클래스에 대한 정적 참조가 들어있어 잘 작동합니다. 하지만 나는 앱을 재설치 할 때, 그리고 아마 업데이트가 올 때,이 정적 멤버가 다시 초기화되지 않을 것이라고 나는 믿을 수 없을 것이다.

나는 파일이 Parcelable를 작성했지만, 마샬()를 사용하여 항상 (내가 바인더 오류를 정렬 화 될 수 없습니다지고있어) 작동하지 않습니다.

안전하게이 정보를 저장할 수 있습니까?

주셔서 감사합니다 예를 정적 사용

+0

다음 옵션을 고려하십시오. http://developer.android.com/guide/topics/data/data-storage.html –

답변

2

내가 디스크에 읽기/쓰기를 처리하기 위해 StateControl 클래스를 사용하여 객체 복원 한 후 aidlBinder 오브젝트를 재 작성 : 다음

public class StateControl { 

    Context mContext; 

    Thread worker; 
    WriteObjectToFile writer; 

    // StateControl Constructor 
    public StateControl(Context context) { 
     mContext = context; 

     // Construct a writer to hold and save the data 
     writer = new WriteObjectToFile(); 

     // Construct a worker thread to handle the writer 
     worker = new Thread(writer); 

    }// end of StateControl constructor 




    // Method to save the global data 
    public void saveObjectData(Object object, String key) { 

     if (object == null){ 
      // I had a different action here 
     } else { 

      // Write the data to disc 
      writer.setParams(new WriteParams(object, key));   
      worker.run(); 

     } 

    }// end of saveGlobalData method 


    // Method to read the Global Data 
    public Object readObjectData(String key){ 

     Object returnData = (Object) readObjectFromFile(key); 

     if (returnData == null){   
      // I had a different action here 
     } else {  
      return returnData; 
     } 

    }// end of readGlobalData method 


    // Method to erase the Global data 
    public void clearObjectData(String key){ 

     writer.setParams(new WriteParams(null, key));  
     worker.run(); 

    }// end of clearGlobalData method 

    private class WriteObjectToFile implements Runnable { 

     WriteParams params; 

     public void setParams(WriteParams params) { 
      this.params = params; 
     } 

     public void run() {   
      writeObjectToFile(params.getObject(), params.getFilename());     
     } 

     private boolean writeObjectToFile(Object object, String filename) { 

      boolean success = true; 

       ObjectOutputStream objectOut = null; 
       try { 

        FileOutputStream fileOut = mContext.openFileOutput(filename, Activity.MODE_PRIVATE); 
        objectOut = new ObjectOutputStream(fileOut); 
        objectOut.writeObject(object); 
        fileOut.getFD().sync(); 

       } catch (IOException e) { 
        success = false; 
        e.printStackTrace(); 
       } finally { 
        if (objectOut != null) { 
         try { 
          objectOut.close(); 
         } catch (IOException e) { 
          // do nothing 
         } 

        }// end of if 
       }// End of try/catch/finally block 

      return success; 
     } 

    }// end of writeObjectToFile method 


    private Object readObjectFromFile(String filename) { 

     ObjectInputStream objectIn = null; 
     Object object = null; 
     try { 

      FileInputStream fileIn = mContext.getApplicationContext().openFileInput(filename); 
      objectIn = new ObjectInputStream(fileIn); 
      object = objectIn.readObject(); 

     } catch (FileNotFoundException e) { 
      // Do nothing 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (ClassNotFoundException e) { 
      e.printStackTrace(); 
     } finally { 
      if (objectIn != null) { 
       try { 
        objectIn.close(); 
       } catch (IOException e) { 
        // do nowt 
       } 
      } 
     } 

     return object; 
    } 


    private static class WriteParams { 

     Object object; 
     String filename; 

     public WriteParams(Object object, String filename) { 
      super(); 
      this.object = object; 
      this.filename = filename; 
     } 

     public Object getObject() { 
      return object; 
     } 

     public String getFilename() { 
      return filename; 
     } 

    } 

} 

을 public 메소드를 호출하여 쓰기/읽기를 시작합니다. 이 버전에서는 별도의 스레드에서 수행 중이지만 필요할 경우 수정할 수 있습니다.

3

메모리 누수로 연결하고 아무것도 할 수있는 좋은 방법이 아니다. 나는 단지 3의 경우 정적 사용하는 것이 좋습니다

:

  1. 정적 최종 문자열 또는 INT는 - 폴더의 유틸리티에
  2. (그들은 외부 클래스에 대한 참조를 포함하지 않도록) 내부 클래스에
  3. 상수 또는 경우에 따라 (CustomFragment.newInstance와 같은) 팩토리 메소드

질문은 왜 PendingIntent를 유지하겠습니까? 그 사용법은 프로세스 간 의사 소통을위한 것입니다.

+0

사실은 좋은 질문입니다. 덕분에 디자인이 바뀌 었습니다. – Mugen

0

바인더

대부분의 개발자는 적절한 바인더의 서브 클래스를 생성 시키 대신 원하는 인터페이스를 설명하는 AIDL 도구를 사용하여,이 클래스를 직접 구현하지 않습니다.

from the official documentation

는 개체의 나머지와 함께 Binder 객체를 저장해야합니까? 어쩌면 당신은 Binder 예를없이 객체를 저장할 수 있습니다, 당신은