Android FileInputStream вылетает - PullRequest
0 голосов
/ 17 июля 2011

Я программист-любитель, разрабатывающий для Android.Я просто пытаюсь получить основы прямо сейчас, но у меня ошибка, и я не знаю, почему.

Я создаю действие, которое имеет кнопку сохранения и кнопку загрузки, которая использует fileOutputStream и fileInputStream для выполнения этой задачи.

Проблема, с которой я сталкиваюсь, заключается в том, что если я нажимаю кнопку загрузки в первый раз, когда использую это действие, мое приложение вылетает.Может кто-нибудь помочь мне с тем, как пропустить раздел загрузки, если файл еще не был создан?Что я должен использовать в своем заявлении 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 ]

2 голосов
/ 17 июля 2011

Вы вызываете openFileInput дважды.Просто позвоните один раз.

Вместо этого

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

Сделайте следующее:

fis = openFileInput(FILENAME);
if (fis != null) {
    // Read file
}
1 голос
/ 17 июля 2011

Если вы выполняете что-то в UI-потоке, это не должно занять больше 5 секунд, иначе сработает ANR .

Если вы хотите сделать что-то, что может занятьдольше, чем эти 5 секунд, вы захотите сделать это в Service или AsyncTask .

Кроме того, если ваше приложение закрыто принудительно и вы неЧтобы знать почему, вы всегда должны смотреть на вывод LogCat , который можно показать в Eclipse.Кроме того, вы должны включать его в каждый вопрос, который вы задаете здесь (об Android).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...