【问题标题】:getContext() returns NullgetContext() 返回 Null
【发布时间】:2018-08-01 18:50:58
【问题描述】:

我在 Android 中使用 getContext() 方法来获取上下文,然后创建文件。但是,当应用程序从崩溃中被调用时,我总是得到一个空指针异常,然后访问 getContext()。

以下是我在崩溃后调用的代码。此代码在崩溃前运行良好,但在崩溃后失败。

synchronized public void insertR(String filename,String content) {
    // TODO Auto-generated method stub
    String filename = filename;
    String string = content;
    Context context = MyActivity.getAppContext();

    FileOutputStream outputStream;
    try {//Context.MODE_PRIVATE
        Log.v("insertR", content);
        System.out.println(filename);
        System.out.println(context); //prints null

        outputStream = context.openFileOutput(filename, Context.MODE_PRIVATE);
        outputStream.write(string.getBytes());
        outputStream.flush();
        outputStream.close();

    } catch (Exception e) {
        e.printStackTrace();
 } }

public class MyActivity extends Activity {
public static Context context;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_simple_dynamo);
    context = getApplicationContext();

    TextView tv = (TextView) findViewById(R.id.textView1);
    tv.setMovementMethod(new ScrollingMovementMethod());
}
public static Context getAppContext() {
    try {
        return context;
    } catch (Exception e) {
        return MyActivity.getAppContext();
    }
}}

【问题讨论】:

  • 方法insertR()在哪个类中

标签: android file-io android-contentprovider


【解决方案1】:

像这样更改insertR() 方法:

synchronized public void insertR(Context context, String filename,String content) {
    // TODO Auto-generated method stub
    String filename = filename;
    String string = content;

    FileOutputStream outputStream;

    try {//Context.MODE_PRIVATE
        Log.v("insertR", content);
        System.out.println(filename);
        System.out.println(context); //prints null

        outputStream = context.openFileOutput(filename, Context.MODE_PRIVATE);
        outputStream.write(string.getBytes());
        outputStream.flush();
        outputStream.close();

    } catch (Exception e) {
        e.printStackTrace();
    } 
}

如果您想从 MainActivity 中调用它,请这样做:

insertR(this, fileName, content);

insertR(getApplicationContext(), fileName, content);

【讨论】:

  • insertR() 在扩展 ContentProvider 的类中,我从 AsyncTask 线程调用 insertR()。
  • 进行上述修改并测试
  • 因为我在另一个异步类中,所以我不能使用“getApplicationContext()”所以,使用了 Context context = MyActivity.getAppContext();并尝试了第二个选项。我仍然收到错误消息。
  • 然后在该类的构造函数中,您必须传递此上下文,将其存储在变量中并将其传递给 InsertR()。没有别的办法
【解决方案2】:

我相信既然你在一个活动中,你可以使用静态函数getApplicationContext() 来检索上下文。

【讨论】:

猜你喜欢
  • 2011-10-11
  • 2018-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-26
  • 2021-12-29
  • 1970-01-01
  • 2020-01-20
相关资源
最近更新 更多