2011-07-16 14 views
0

私はアンドロイド用に開発している素人プログラマーです。私はちょうど基本を下に置いてみようとしていますが、私は間違いを抱えています。理由はわかりません。android FileInputStreamがクラッシュする

私は、このタスクを達成するためにfileOutputStreamfileInputStreamを使用する、保存ボタンと読み込みボタンを持つアクティビティを作成しています。

問題は、初めてアクティビティを使用したときにロードボタンを押したときにアプリケーションがクラッシュするという問題です。ファイルがまだ作成されていない場合、ロードセクションをスキップする方法を教えてもらえますか? if文の中で何を使うべきですか?

おかげトンは、ここに私のコードは次のとおりです。助けルーカスため

import android.app.Activity; 
import android.content.Context; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.TextView; 

public class InternalData extends Activity implements OnClickListener { 

    String FILENAME = "InternalString"; 
    EditText sharedData; 
    TextView dataResults; 
    FileOutputStream fos; 
    String d; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.sharedpreferences); 
     Button save = (Button) findViewById(R.id.bSave); 
     Button load = (Button) findViewById(R.id.bLoad); 
     sharedData = (EditText) findViewById(R.id.etSharedPrefs); 
     dataResults = (TextView) findViewById(R.id.tvLoadSharedPrefs); 
     save.setOnClickListener(this); 
     load.setOnClickListener(this); 
     try { 
      fos = openFileOutput(FILENAME, Context.MODE_PRIVATE); 
     } catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    public void onClick(View v) { 
     // TODO Auto-generated method stub 
     switch (v.getId()) { 
     case R.id.bSave: 
      d = sharedData.getText().toString(); 

      try { 

       fos.write(d.getBytes()); 
       fos.close(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

      break; 
     case R.id.bLoad: 
      FileInputStream fis = null; 
      try { 
       if (openFileInput(FILENAME) != null){ 
       fis = openFileInput(FILENAME); 
       byte[] data = new byte[fis.available()]; 
       while(fis.read(data) != -1){ 
        String readData = new String(data); 
        dataResults.setText(readData); 
       }} 
      } catch (FileNotFoundException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      }finally{ 
       try { 
        fis.close(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
      } 

      break; 
     } 
    } 
} 

おかげで、私は自分のコードを更新している、とあなたは必ず私がAsyncTaskを使用しています作るためにそれを上に見ることができる場合、私は思っていました正しく。再度、感謝します!

public class InternalData extends Activity implements OnClickListener { 

String FILENAME = "InternalString"; 
EditText sharedData; 
TextView dataResults; 
FileOutputStream fos; 
String d; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.sharedpreferences); 
    Button save = (Button) findViewById(R.id.bSave); 
    Button load = (Button) findViewById(R.id.bLoad); 
    sharedData = (EditText) findViewById(R.id.etSharedPrefs); 
    dataResults = (TextView) findViewById(R.id.tvLoadSharedPrefs); 
    save.setOnClickListener(this); 
    load.setOnClickListener(this); 

} 

public void onClick(View v) { 
    // TODO Auto-generated method stub 
    switch (v.getId()) { 
    case R.id.bSave: 
     d = sharedData.getText().toString(); 

     try { 
      fos = openFileOutput(FILENAME, Context.MODE_PRIVATE); 
      fos.write(d.getBytes()); 
      fos.close(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     break; 
    case R.id.bLoad: 

      AsyncTask<String, Integer, String> dat = new loadInternalData().execute(FILENAME); 

     break; 
    } 
} 

public class loadInternalData extends AsyncTask<String, Integer, String> { 

    @Override 
    protected String doInBackground(String... params) { 
     // TODO Auto-generated method stub 
     FileInputStream fis = null; 
     String collected = null; 
     try { 
      fis = openFileInput(FILENAME); 
      byte[] data = new byte[fis.available()]; 
      while (fis.read(data) != -1){ 
       collected = new String(data); 

      } 
     } catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     }finally{ 
      try { 
       fis.close(); 
       return collected; 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
     return collected; 
    } 
    @Override 
    protected void onPostExecute(String result) 
    { 
      super.onPostExecute(result); 
      Log.i("InteralStorage", "onPostExecute(): " + result); 
      dataResults.setText(result); 

    } 
} 

}

答えて

2

あなたは二回openFileInput呼んでいます。ただ一度それを呼んでください。あなたはUIスレッド上で何かを実行すると、それはそれから5秒を取るべきではないかANRがトリガされます

fis = openFileInput(FILENAME); 
if (fis != null) { 
    // Read file 
} 
1

:代わりにこの

if (openFileInput(FILENAME) != null){ 
    fis = openFileInput(FILENAME); 
} 

はこれを行います。

5秒以上かかることがあるようなら、ServiceまたはAsyncTaskで行うことをおすすめします。

また、アプリが強制終了され、その理由がわからない場合は、Eclipseで表示できるLogCatの出力を常に確認する必要があります。また、あなたがここで質問するすべての質問(Androidについて)とともにそれを含める必要があります。

+0

助けてくれてありがとう、私はそれが働いていると思う、ちょうど私が正しく使用しているかどうかを確認するために更新されたコードをチェックできますか? – travis

+0

それは動作しますが、ファイルに何かを保存する前にロードボタンを押すとまだクラッシュするので、私はまだ初期の問題があります – travis

+0

OK、LogCatの出力を追加してください。 –

関連する問題