사용자가 히스토리 목록에서 특정 제품을 선택할 때 이미지를 표시하기 위해 영구 저장소에 이미지의 경로를 저장하려고합니다 (제품 당 하나의 이미지, 사용자). 이제 내가 겪고있는 문제는 처음 앱을 휴대 전화에로드하고 영구 저장소에 항목을 추가하려고하면 잠시 후에 오류가 발생하고 앱이 정지됩니다. 그러나 다시 돌아와 이미지를 다시 추가하면 각 특정 제품을 선택할 때 이미지가 항상로드됩니다.BlackBerry 6의 영구 저장소 버그에 데이터 저장
이것은 내가 무슨 일이 있어도 예외를 throw하는 최초의 store8.commit()이라고 생각합니다 : 디버깅 할 때 스택 추적 없음.
public class Storage extends Application {
private static final long PERSISTENT_KEY8 = 0x2c4c45c139ee9728L;
static PersistentObject store8 = PersistentStore.getPersistentObject(PERSISTENT_KEY8);
private static Vector pics;
/**
* Picture Section ***********************************************************
*/
public static void savePicture(){
store8.setContents(new Vector());
store8.commit();
if(pics == null){
pics = new Vector();
}
synchronized(store8) {
store8.setContents(pics);
store8.commit();
}
}
public static String getPicture(String productName){
if(pics.size()==0){
return "";
}else{
for(int i = 0; i < pics.size(); i++){
Pics product = (Pics)pics.elementAt(i);
if(product.getProductName().equals(productName)){
return product.getPic();
}
}
return "";
}
}
public static void removePicture(String productName){
if(pics.size()==0){
return;
}else{
for(int i = 0; i < pics.size(); i++){
Pics product = (Pics)pics.elementAt(i);
if(product.getProductName().equals(productName)){
pics.removeElementAt(i);
}
}
}
}
public static void loadPicture(){
pics = (Vector)store8.getContents();
if(pics == null){
pics = new Vector();
}
}
public static void setPicture(Pics pro){
if(pics.size()!=0){
for(int j = 0; j< pics.size() ; j++){
Pics product = (Pics)pics.elementAt(j);
if(pro.getProductName().equals(product.getProductName())){
pics.removeElementAt(j);
}
}
}
pics.addElement(pro);
}
}
그래서 그 이미지를 저장 내 메소드를 포함하는 클래스입니다 : 여기 내 코드입니다. 이제 다른 클래스의 어디를 조작하고있다 :이 클래스의 많은 부분이 긴 경우 유감을 제거
public class ProductImage extends MainScreen implements FieldChangeListener, AppLaunchResource {
private ImageButtonField logo;
private ButtonField newImage, chooseExisting;
public static BitmapField takenPicture;
//public static String picPath ="";
private String currentPicture = "";
private String currentProduct ="";
public ProductImage(String productName){
super(VERTICAL_SCROLL|VERTICAL_SCROLLBAR);
currentProduct = productName;
createGUI();
}
public void createGUI(){
deleteAll();
this.setTitle(new LabelField("Add An Image", Field.FIELD_HCENTER));
if(ToolbarManager.isToolbarSupported())
{
Toolbar tb = new Toolbar();
setToolbar(tb.createToolBar());
}
else{
Toolbar tb = new Toolbar();
add(tb.createNavBar());
}
try{
Storage.loadPicture();
}catch(NullPointerException e){
e.printStackTrace();
}
newImage = new ButtonField("Take Photo", ButtonField.CONSUME_CLICK){
public int getPreferredWidth() {
return (int) (net.rim.device.api.system.Display.getWidth());
}
};
chooseExisting= new ButtonField("Change Image", ButtonField.CONSUME_CLICK){
public int getPreferredWidth() {
return (int) (net.rim.device.api.system.Display.getWidth());
}
};
newImage.setChangeListener(this);
chooseExisting.setChangeListener(this);
EncodedImage enc = EncodedImage.getEncodedImageResource("camera.png");
EncodedImage sizeEnc = ImageResizer.sizeImage(enc, Display.getHeight(), Display.getHeight());
takenPicture = new BitmapField(enc.getBitmap());
VerticalFieldManager vfMain = new VerticalFieldManager();
vfMain.add(new SeparatorField());
vfMain.add(newImage);
vfMain.add(chooseExisting);
vfMain.add(takenPicture);
add(vfMain);
currentPicture = Storage.getPicture(currentProduct);
showPicture();
}
public void choosePicture(){
String imageExtensions[] = {"jpg", "jpeg",
"bmp", "png", "gif"};
FileSelectorPopupScreen fps = new FileSelectorPopupScreen(null, imageExtensions);
fps.pickFile();
String theFile = fps.getFile();
UiApplication.getUiApplication().pushScreen(fps);
if (theFile == null)
{
Dialog.alert("Screen was dismissed. No file was selected.");
}
else
{
try{
String path= "file:///" + theFile;
byte[] data = getData(path);
//Encode and Resize image
EncodedImage eImage = EncodedImage.createEncodedImage(data,0,data.length);
if(Display.getHeight()>Display.getWidth()){
int scaleFactorX = Fixed32.div(Fixed32.toFP(eImage.getWidth()),
Fixed32.toFP(Display.getWidth()));
int scaleFactorY = Fixed32.div(Fixed32.toFP(eImage.getHeight()),
Fixed32.toFP((Display.getWidth()*Display.getWidth())/Display.getHeight()));
eImage=eImage.scaleImage32(scaleFactorX, scaleFactorY);
}
else{
int scaleFactorX = Fixed32.div(Fixed32.toFP(eImage.getWidth()),
Fixed32.toFP(Display.getWidth()));
int scaleFactorY = Fixed32.div(Fixed32.toFP(eImage.getHeight()),
Fixed32.toFP(Display.getHeight()));
eImage=eImage.scaleImage32(scaleFactorX, scaleFactorY);
}
UiApplication.getUiApplication().popScreen(fps);
takenPicture.setBitmap(eImage.getBitmap());
Storage.setPicture(new Pics(currentProduct, path));
try{
Storage.savePicture();
}catch(Exception e){
e.printStackTrace();
}
}
catch(Exception e){
}
Dialog.alert("Picture Saved");
}
}
public void showPicture(){
if(currentPicture != ""){
try{
String path= currentPicture;
byte[] data = getData(path);
//Encode and Resize image
EncodedImage eImage = EncodedImage.createEncodedImage(data,0,data.length);
if(Display.getHeight()>Display.getWidth()){
int scaleFactorX = Fixed32.div(Fixed32.toFP(eImage.getWidth()),
Fixed32.toFP(Display.getWidth()));
int scaleFactorY = Fixed32.div(Fixed32.toFP(eImage.getHeight()),
Fixed32.toFP((Display.getWidth()*Display.getWidth())/Display.getHeight()));
eImage=eImage.scaleImage32(scaleFactorX, scaleFactorY);
}
else{
int scaleFactorX = Fixed32.div(Fixed32.toFP(eImage.getWidth()),
Fixed32.toFP(Display.getWidth()));
int scaleFactorY = Fixed32.div(Fixed32.toFP(eImage.getHeight()),
Fixed32.toFP(Display.getHeight()));
eImage=eImage.scaleImage32(scaleFactorX, scaleFactorY);
}
takenPicture.setBitmap(eImage.getBitmap());
}
catch(Exception e){
}
}
}
public void fieldChanged(Field field, int context) {
if(field == logo){
}
else if(field == newImage){
takePicture();
}
else if(field == chooseExisting){
choosePicture();
}
}
}
, 거기에 기본적으로있는 4 보관 방법이 코드에서 호출 나는 그들이 모든 믿는 바로 장소 ..하지만 다시 첫 번째 하중에 문제가있는, 나중에 없습니다.
아무도 내가 여기서 잘못하고있는 것을 볼 수 있습니까? 1 주일 동안이 문제가 발생했습니다.
도움을 주셔서 감사합니다! 이 같은
'--i' 또는'--j'없이'pics.removeElementAt'를하면 다음 항목을 건너 뜁니다. –
이들을 추가하려고 시도했지만 출력을 변경하지 않았습니다. –
@JoopEggen :'--i' 또는'--j'를 사용하는 대신, 루프는 일치하는 것이 발견되었을 때 대신'break'를 사용해야합니다. –