我目前正在学习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);
}
}
}
非常感谢任何帮助,谢谢!
答案 0 :(得分:0)
实际上看起来我有一两个额外的方法(比如onPreExecute),其中没有代码,当我删除它时它开始工作。