Android App Async无法加载内部数据

时间:2014-09-29 22:54:56

标签: android asynchronous io

我目前正在学习IO和Async,但遇到了问题。我正在按照指南,根据指南,这应该工作。我创建了一个带有简单的EditText,TextView和2个按钮(保存并加载)的活动。我试图让保存按钮获取EditText中的文本并保存到内部存储,并且加载按钮采取保存的任何内容并设置TextView。当我把所有代码都放在UI线程中运行时,一切都运行得很完美,但如果我更改代码让UI线程调用Async类进行加载,似乎什么都没发生。

**已删除包裹和导入以节省空间。

public class InternalData extends Activity implements OnClickListener {

EditText etSharedData;
TextView tvDataResults;
FileOutputStream fos;
String FILENAME = "InternalString";

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.sharedpreferences);
    setupVariables();
}

private void setupVariables() {
    Button bSave = (Button) findViewById(R.id.bSave);
    Button bLoad = (Button) findViewById(R.id.bLoad);
    etSharedData = (EditText) findViewById(R.id.etSharedPrefs);
    tvDataResults = (TextView) findViewById(R.id.tvLoadSharedPrefs);
    bSave.setOnClickListener(this);
    bLoad.setOnClickListener(this);
    try {
        fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
        fos.close();
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

@Override
public void onClick(View v) {
    // TODO Auto-generated method stub
    switch (v.getId()) {
    case R.id.bSave:
        String sData = etSharedData.getText().toString();   
        try {
            fos = openFileOutput(FILENAME, Context.MODE_PRIVATE);
            fos.write(sData.getBytes());
            fos.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

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

        break;
    }
} 

前面的代码使一切正常,但在尝试加载大字符串时,UI有点滞后。当我尝试让LoadSomeStuff(Async)类进行加载时,当我在手机上点击Load时,它什么都没做。在LoadSomeStuff类中,它使用doInBackground方法打开文件并将数据读入字符串然后返回该字符串,onPostExecute方法将TextView的文本设置为返回的String。这是代码:

加载按钮的onClick方法有:

    new LoadSomeStuff().execute(FILENAME);

LoadSomeStuff类*注意:此类在InternalData类中声明。

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

    @Override
    protected String doInBackground(String... arg0) {
        // TODO Auto-generated method stub
        String sCollected = null;
        FileInputStream fis = null;
        try {
            fis = openFileInput(FILENAME);
            byte[] dataArray = new byte[fis.available()];
            while(fis.read(dataArray) != -1){
                sCollected = new String(dataArray);
            }
        } 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 sCollected;
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        return null;
    }

    protected void onPostExecute(String result){
        tvDataResults.setText(result);
    }
}

}

非常感谢任何帮助,谢谢!

1 个答案:

答案 0 :(得分:0)

实际上看起来我有一两个额外的方法(比如onPreExecute),其中没有代码,当我删除它时它开始工作。