如何在非活动类中使用活动方法?尝试使用上下文时程序崩溃

时间:2019-01-03 03:14:02

标签: java android crash android-context

我正在尝试在非活动类中使用openFileOutput方法。当我尝试使用上下文时,从MainActivity(此)中,程序崩溃。

某种形式可以在我的课程中使用该方法?

private Context context;

public Events(Context context) {
    this.context = context;
}

public void setEvent(int year, int month, int dayNumber, int hour, int minutes, String event, String eventParameters) {
    try {
        OutputStreamWriter events = new OutputStreamWriter(context.openFileOutput("events.txt", Context.MODE_PRIVATE));         

    } catch(IOException e) {
        e.printStackTrace();
    } // End of try  
} // End of method - setEvent

我有一个个性化对话框,用于调用setEvent方法。

public CellOptions(final Dialog dialog) {

final Events event = new Events(dialog.getContext());       
final TextView newEvent = (TextView) dialog.findViewById(R.id.newEvent), eventView = (TextView) dialog.findViewById(R.id.eventView);

newEvent.setOnClickListener(new View.OnClickListener() {
    public void onClick(View option) {
        event.setEvent(2018, 0, 1, 0, 0, "New year", "Nothing");

        eventView.setBackgroundColor(Color.rgb(0, 0, 8));
    }
});
}

public boolean showed() {
    return true;
}

我也试图从下一种形式的MainActivity类中使用setEvent。

Events event = new Events(this, the next parameters);

但这不起作用。

我已经搜索了有关此问题的答案,但找不到能帮助我的解决方案。

我找到了这些页面,但同样的问题仍然存在。

how to call method in activity form non activity class

Getting activity from context in android

using openFileOutput() in a class. (not an activity)

http://www.sgoliver.net/blog/ficheros-en-android-i-memoria-interna/

运行程序时,使用上下文会崩溃。

Logcat显示以下内容:

  

01-03 15:55:25.932:W / Binder(632):从活页夹存根实现中捕获了RuntimeException。   01-03 15:55:25.932:W / Binder(632):java.lang.NullPointerException   01-03 15:55:25.932:W / Binder(632):在android.inputmethodservice.IInputMethodWrapper.setSessionEnabled(IInputMethodWrapper.java:280)   01-03 15:55:25.932:W / Binder(632):在com.android.internal.view.IInputMethod $ Stub.onTransact(IInputMethod.java:129)   01-03 15:55:25.932:W / Binder(632):在android.os.Binder.execTransact(Binder.java:404)   01-03 15:55:25.932:W / Binder(632):在dalvik.system.NativeStart.run(本机方法)   01-03 15:55:25.932:W / InputMethodManagerService(487):得到RemoteException发送setActive(false)通知给pid 2744 uid 10036   01-03 15:55:26.572:I / ActivityManager(487):显示com.android.dropcalendary / .MainActivity:+ 4s402ms

3 个答案:

答案 0 :(得分:1)

在非活动类别中使用活动方法吗?简而言之,您不能

但是可以肯定的是,您可以传递活动(通常不是一个好主意,如果活动被破坏,则可能导致空指针或内存泄漏)。

另一种方法是,如果需要上下文,则可以使用ApplicationContext。

答案 1 :(得分:0)

使用 ApplicationContext 代替上下文。由于此Context的生命周期一直保留到应用程序被销毁或完成为止。 因此,仅在活动被销毁之前保留 Context

getApplicationContext();      

答案 2 :(得分:0)

我已经解决了问题。

该方法在活动中有效,要在非活动类中使用该方法,我确实使用过:

getApplicationContext();

我确实使用了它,通过MainOptions类通过CellOptions类发送了上下文,并且在CellOptions类中确实发送了相同的上下文。

MainActivity:

new CellOptions(cellOptions, getApplicationContext());

CellOptions类(上下文=应用程序上下文):

Events event = new Events(context);

事件类:

context.openFileOutput(events.txt);

另一个问题是我使用“ /”,而不是“ \\”