AsyncTask中的代码不在Java中执行

时间:2014-07-01 00:41:21

标签: java android android-asynctask

为了允许对文本文件进行读/写操作,我需要将操作放在AsyncTask中。但是,因为我已经设置了AsyncTask,所以我无法让它执行。

由于我正在执行AsyncTask中的所有操作,所以我没有在post执行中添加任何内容。

AsyncTask代码:

public class SaveTopic extends AsyncTask<Void, Void, Void> {

    @Override
    protected Void doInBackground(Void... voids) {

        File file = getContext().getFileStreamPath(Environment.getExternalStorageDirectory() + "/topics.json");

        if(!file.exists()){ //Checks if file exists (creates if not)
            try {
                file.createNewFile();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

            try{
                //true = append file
            FileWriter fileWriter = new FileWriter(file.getName(),true); //true = append file
            BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
            bufferedWriter.newLine();
            bufferedWriter.newLine();
            bufferedWriter.write(flat);
            bufferedWriter.close();

            }catch (IOException e){
            //TODO message that error in file handling  

            }


            try{
                FileReader fr = new FileReader("topics.json");
                BufferedReader br = new BufferedReader(fr);

                String str;
                while((str = br.readLine()) !=null){
                    Log.e("log_tager", str + "\n");
                }

                br.close();

            }catch (IOException e){


            }

            return null;
    }


    protected void onPostExecute(String outstring){

}
}

备注:

  • 我确保AsyncTask在主类中。
  • new SaveTopic()。execute();已被添加。
  • “flat”是一个公共字符串。

编辑:我收到的错误是由于文件名:

E/AndroidRuntime(6886): Caused by: java.lang.IllegalArgumentException: File /storage/emulated/0/topics.json contains a path separator

3 个答案:

答案 0 :(得分:0)

根据您的代码,您无需在UI上更新任何内容,那么为什么要使用AsyncTak。一个简单的Thread就足够了。

Thread thread = new Thread(){
    public void run(){
     // Your code here
    }
  }
thread.start();

答案 1 :(得分:0)

此方法在应用程序的私有数据区域中打开一个文件。您无法使用此方法打开此区域中的子目录中的任何文件或完全打开其他区域中的任何文件。所以使用FileInputStream或类似的

file.exists是。但getFileStreamPath无法获取路径,需要在该目录中获取文件名。试试这个:

File file = new File(this.getFilesDir().getAbsolutePath() + "/topics.json");

答案 2 :(得分:0)

我会尝试这样的事情。因为看起来你已经对某些String值进行了硬编码,因为它们可以变量并使事情更简单。 FileReader也可以接受一个文件而不是一个字符串,在我看来,这将更容易和更简单的阅读。

我相信Aproov对于你给出的FileReader是正确的,但它需要整个名称,例如文件所在的文件夹。我也相信Nepster是正确的,有一个额外的斜线,但我是不是100%肯定。

我希望这有助于或至少指出正确的方向来帮助您解决问题。

public class SaveTopic extends AsyncTask<Void, Void, Void> {

     @Override
     protected Void doInBackground(Void... voids) {

            //Filename 
            String fileName = "topics.json";          

            File file = getContext().getFileStreamPath(Environment.getExternalStorageDirectory() + "/" +fileName);  //Filename variable instead of hard coded string

            //Checks if file exists (creates if not)
            if(!file.exists()){ 

                try {

                    file.createNewFile();

                } catch (IOException e) {

                     Log.e(this.getClass().getName(), e.printStackTrace());
                }
            }


            try{


                FileWriter fileWriter = new FileWriter(file);//Pass the file object
                BufferedWriter bufferedWriter = new BufferedWriter(fileWriter);
                bufferedWriter.newLine();
                bufferedWriter.newLine();
                bufferedWriter.write(flat);
                bufferedWriter.close();

            }catch (IOException e){

                Log.e(this.getClass().getName(), e.printStackTrace());
            }


            try{
                FileReader fr = new FileReader(file); //Lets pass the file into the constructor instead of a hardcoded string. 
                BufferedReader br = new BufferedReader(fr);

                String str;
                while((str = br.readLine()) !=null){
                        Log.i("log_tager", str + "\n");
                }

                br.close();

           }catch (IOException e){

                Log.e(this.getClass().getName(), e.printStackTrace());

           }

           return null;

    }


    protected void onPostExecute(String outstring){

    }
}