0

我是一名为 android 开发的业余程序员。我现在只是想了解基础知识,但我遇到了一个错误,我不知道为什么。

我正在创建一个具有保存和加载按钮的活动,它使用fileOutputStreamandfileInputStream来完成此任务。

我遇到的问题是,如果我第一次使用活动时点击加载按钮,我的应用程序就会崩溃。如果文件尚未创建,谁能帮我跳过加载部分?我应该在 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;
        }
    }
}

感谢 Lukas 的帮助,我已经更新了我的代码,我想知道你是否可以检查一下以确保我正确使用了 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 );

     }
}

}

4

2 回答 2

2

您正在调用 openFileInput 两次。只需调用一次。

而不是这个

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

做这个:

fis = openFileInput(FILENAME);
if (fis != null) {
    // Read file
}
于 2011-07-16T21:43:48.677 回答
1

如果您在 UI 线程上执行某些操作,则不应超过 5 秒,否则将触发ANR 。

如果您想做的事情可能需要比这 5 秒更长的时间,您需要在ServiceAsyncTask中进行。

此外,如果您的应用程序被强制关闭并且您不知道为什么,您应该始终查看可以在 Eclipse 中显示的LogCat输出。此外,您应该将它包含在您在这里提出的每个问题中(关于 Android)。

于 2011-07-16T21:45:48.483 回答