2015-03-28 2 views
-1

Я написал несколько функций для создания/редактирования файлов, и они отлично работали. Однако мне нужно было использовать эту функцию во многих видах деятельности, поэтому я нашел руководство о том, как глобализировать функции, и каким-то образом это сделал. Но после того, как я поместил свои функции в отдельный класс, они перестали работать. Мой logcat не работает, поэтому я не могу его попробовать, но даже если бы мог, я не думаю, что это мне поможет.java.io.FileNotFoundException при записи во внутреннюю память

Вот часть MainActivity.java:

MyHelper myHelp = new MyHelper(this); 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.activity_main); 
myHelp.synchronizedb("filename"); 
} 

Вот часть MyHelper.java:

public class MyHelper extends ActionBarActivity { 
Context mContext; 

public MyHelper(Context context){ 
    this.mContext = context; 
} 
public void writeFile(String fname, String fcontent) { 
     BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(openFileOutput(fname, MODE_APPEND))); 
     bw.write(fcontent); 
     bw.close(); 
} 



public void synchronizedb(String filename) { 
    writeFile(filename, "blabla"); 
} 
} 
+0

Что вы подразумеваете под "нерабочим"? Ошибка компиляции? ошибка выполнения? Исключение брошено? Не то, что вы ожидаете увидеть в своем выходном файле? – jas

+0

Этот код не компилируется; 'writeFile()' должен бросать 'IOException'. – fge

+0

Также вы вызываете что-то под названием 'synchrondb', но ваш помощник имеет метод под названием' synchronizedb'. – jas

ответ

0

Вы неправильно сделать класс, который не используется как активность подкласса расширения ActionBarActivity , Невозможно вызвать new для любого подкласса Activity, так как только действие, которое было создано системой, будет полностью функционировать, и только после его метод onCreate() был вызван системой.

Вероятно, вы надавили на свой класс-помощник своего рода поддельную деятельность, чтобы иметь возможность использовать методы, унаследованные от Activity (и аналогичные), такие как openFileOutput(). Но это невозможно.

Более работоспособное решение уронить «расширяет ActionBarActivity» от Вашего имени класса, и либо использовать переданные в контексте ссылке:

mContext.openFileOutput(...) 

Или, может быть, даже лучше, обнаружил внутреннее место хранения в конструктор и сохранить, что для дальнейшего использования:

public class MyHelper { 
    Context mContext; 
    File mDir; 

    public MyHelper(Context context){ 
     this.mContext = context; 
     this.mDir = context.getFilesDir(); 
    } 
    public void writeFile(String fname, String fcontent) { 
      BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(
       new FileOutputStream(new File(mDir, fname), MODE_APPEND))); 
      bw.write(fcontent); 
      bw.close(); 
    } 

Кроме того, из-за этого правила о класс активность только будучи полностью функциональным после его OnCreate() вызывается, вы должны переместить создание вспомогательного класса в или после того, как utilizi ng Деятельность onCreate()

MyHelper myHelp; //can't initialize as our context is not yet valid 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    myHelp = new MyHelper(this); //now we have a working context to pass 
    myHelp.synchronizedb("filename"); 
} 
+0

Thx много. Теперь он работает! – miha64

Смежные вопросы