我目前处于初学者级别,涉及到Android&我目前正在审视我目前面临的一个问题。
我正在创建一个Android应用来检查" cache.json"存在于内部存储中:
这是代码段:
public class ShowClasses extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
filename = "cache.json";
file = new File(getApplicationContext().getFilesDir(), filename);
if (file.exists()) {
System.out.println("EXISTS");
} else {
System.out.println("DOES NOT EXIST");
writeFile();
}
readFile();
}
public void writeFile() {
new JsonTask().execute(email);
}
public void readFile() {
FileInputStream fin = null;
try {
fin = new FileInputStream(file);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
int c;
result = "";
try {
while( (c = fin.read()) != -1){
result = result + Character.toString((char)c);
}
} catch (IOException e) {
e.printStackTrace();
}
try {
fin.close();
} catch (IOException e) {
e.printStackTrace();
}
return;
}
private class JsonTask extends AsyncTask<String, Void, String> {
protected void onPreExecute() {
result = ""; // Clear result
super.onPreExecute();
pd.setMessage("Please wait");
pd.setCancelable(false);
pd.show();
}
protected String doInBackground(String... params) {
return "THIS STRING IS GOING TO BE RETURNED " + params[0];
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
FileOutputStream fileout = null;
try {
fileout = new FileOutputStream(file);
fileout.write(result.getBytes());
//display file saved message
msg("File saved successfully!");
} catch (Exception e) {
e.printStackTrace();
}
try {
fileout.close();
} catch (IOException e) {
e.printStackTrace();
}
if (pd.isShowing()){
pd.dismiss();
}
}
}
}
我试图删除代码中不必要的部分,使其长度更短。
我面临的实际问题是writeFile()&amp; readFile()都被调用。当我打开流时,我在readFile()中得到一个FileNotFoundException,即使应该创建该文件,因为在readFile()之前调用了writeFile()。
如果我在一次执行中写文件&amp;然后在另一个上调用readFile(),它只是按原样运行。
这是我所面临的错误。
System.err:java.io.FileNotFoundException:/data/user/0/host.timetable.timetablenotifier/files/cache.json(没有这样的文件或目录) System.err:at java.io.FileInputStream.open(Native Method)
任何帮助都会非常感激。
由于
答案 0 :(得分:1)
AsyncTask
在后台线程中运行,因此主线程中的其他代码不会等待执行完成。简而言之,readFile()
方法在writeFile()
完成之前执行,因此有FileNotFoundException
。如果您将readFile()
方法放在onPostExecute()
Asynctask
方法的末尾,那么对您有用的是什么?
答案 1 :(得分:1)
writeFile()
是异步的。当该方法返回时,对此文件没有任何影响。最多可能会调用onPreExecute()
的{{1}}。因此,当您致电JsonTask
时,该文件尚不存在。
除此之外:
您在readFile()
中使用了AsyncTask
,但在writeFile()
中执行了磁盘I / O,并且在主应用程序线程上调用了该方法。
您正在onPostExecute()
的主应用程序线程上执行磁盘I / O.
您捕获异常,记录它们,但随后继续执行您的代码,而大多数异常意味着后面的语句也将失败。
出于性能原因,一次只读一个数据readFile()
并不是推荐接近20年的方法。
您将遇到与配置更改相关的多个问题,例如屏幕轮换,因为您的int
和AsyncTask
帐户的配置都没有更改
此外:
ProgressDialog
可由getApplicationContext().getFilesDir()
getFilesDir()
取代
您不需要onCreate()