2016-10-22 2 views
0

그래서 처음으로 Android 앱을 만들려고합니다. 지금은 단순한 집계 계산 카운터이지만 이상한 버그를 발견했습니다.android app를 만드는 이상한 버그

간단한 저장 및로드 기능, 증가, 감소 및 재설정 버튼이 있습니다. 값을 모두 표시하는 TextView가 있습니다 (아래 참조).

값을 10으로 늘리고 앱을 닫을 때 저장해야하며 앱을 다시 열 때 다시 10이됩니다. 그러나 30이나 100을 닫고 다시 시작하면 값이 달라 지거나 완전히 다른 값으로 나옵니다.

어떤 일이 벌어 질 수 있습니까?

MainActivity.java

public class MainActivity extends AppCompatActivity { 
    private static final String TAG = MainActivity.class.getSimpleName(); 

    int value; 

    TextView textView_value; 
    final String filename = "tallyCountPlus"; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     loadValue(filename); 

     textView_value = (TextView) findviewById(R.id.textView_value); 
     textView_value.setText(Integer.toString(value)); 
    } 

    /** Called when the user presses the increment button */ 
    public void incValue(View view) { 
     value++; 
     textView_value.setText(Integer.toString(value)); 
    } 

    /** Called when the user presses the decrement button */ 
    public void decValue(View view) { 
     if (value > 0) { 
      value--; 
     } 
     textView_value.setText(Integer.toString(value)); 
    } 

    /** Called when the user presses the reset button */ 
    public void resetValue(View view) { 
     value = 0; 
     textView_value.setText(Integer.setString(value)); 
    } 

    @Override 
    public void onPause() { 
     super.onPause(); 
     saveValue(filename, Context.MODE_PRIVATE); 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 
     loadValue(filename); 
     textView_value.setText(Integer.toString(value)); 
    } 

    public void onDestroy() { 
     super.onDestroy(); 
     saveValue(filename, Context.MODE_PRIVATE); 
    } 

    private void loadValue(String name) { 
     try { 
      FileInputStream fis = openFileInput(name); 

      value = fis.read(); 

      fis.close(); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    private void saveValue(String name, int context) { 
     try { 
      FileOutputStream fos = openFileOutput(name, context); 

      fos.write(value); 

      fos.close(); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

사람은 내 문제가 될 수 뭔지 알아?

감사합니다.

제이미.

편집 :

private void loadValue(String filename) { 
/* this is wrapped in a try-catch statement */ 
    FileInputStream fis = openFileInput(name); 
    InputStreamReader isr = new InputStreamReader(fis); 
    BufferedReader br = new BufferedReader(isr); 
    StringBuilder = new StringBuilder(); 
    String line; 

    while ((line = br.readLine()) != null) { 
     sb.append(line); 
    } 

    value = Integer.parseInt(sb.toString()); 

    fis.close() /* Not sure if this is actually neccessary? */ 

    if (value == -1) { 
     value = 0; 
    } 
} 

private void saveValue(String name) { 
/* This is also wrapped in a try-catch statement */ 
    FileOutputStream fos = openFileOutput(name, Context.MODE_PRIVATE); 

    String data = Integer.toString(value); 
    fos.write(data.getBytes()); 

    fos.close(); 
} 

그리고 값의 몇 퍼팅 후

, 잘 작동하는 것 같다 :

그래서 내가 수행하여 버그를 수정했습니다 생각합니다. 그러나 이전 값을 추가하거나 삭제하고 대체하는지 여부를 확신 할 수 없습니다 ... 저장 파일이 너무 커지지 않게하려면 후자를 사용하는 것이 좋습니다.

+1

외부 쓰기 권한을 제공했는지 확인하십시오. – Nithinlal

+0

외부 저장소가 아닌 내부 저장소를 사용하고 있으므로 외부 쓰기 권한이 필요하지 않습니다. –

답변

0

onDestroy()은 신뢰할 수 없습니다. onPause()을 고수하십시오. 또한 일반적으로 활동이 "사라지는"경우 이벤트를 처리하는 메서드의 경우 코드 뒤에 super 메서드 을 호출하여 사용자 지정 코드가 계속 실행되도록해야합니다. 확인

다른 상황이 될 수 있습니다

  • 출력 이전 파일 교체를 절약하거나 그것에를 추가하는 방법인가?

  • 매번 제대로로드하고 저장 하시겠습니까?

  • 파일이 제대로로드 된 경우 값을 TextView으로 만드시겠습니까? TextView이 기본 (UI) 스레드에 의해 업데이트되도록하는 익명의 Runnable을 생성해야 할 수도 있습니다. 자유롭게 코드 전반에 걸쳐

뿌려 로그 문 등

파일 문제를 진단 할 때, 에뮬레이터에서 테스트하는 데 도움이

집계가 무엇인지를 추적, 당신이 파일에서 무엇을 얻을, 유지 그러면 장치 저장소에 대한 루트 액세스 권한이 부여됩니다.

+0

내 dev phone에 Cyanogen 13이있어 루트 액세스가 문제가되지 않습니다. 그러나 실제로 파일을 저장할 위치를 찾을 수 없습니다. –

+0

'/ data/data/your.app.package.name/files /'시도하십시오 – zerobandwidth

0

loadValue() 메서드를 수정해야합니다. 다음 바이트를 반환하는 값에 fis.read()를 지정하거나 EOF에 도달하면 -1을 지정합니다.

private void loadValue(String name) { 
    try { 
     FileInputStream in = openFileInput(name); 
     InputStreamReader inputStreamReader = new InputStreamReader(in); 
     BufferedReader bufferedReader = new BufferedReader(inputStreamReader); 
     StringBuilder sb = new StringBuilder(); 
     String line; 
     while ((line = bufferedReader.readLine()) != null) { 
      sb.append(line); 
     } 
     value = Integer.parseInt(sb.toString()); 

    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
+0

주에서 NumberFormatException 예외가 발생합니다 : 잘못된 int : "[]" 및 NFE에 대한 catch 문을 넣을 때 , 그것을 닫을 때마다 0으로 되돌아갑니다. –