Java - 无法从静态上下文

时间:2015-06-07 06:17:21

标签: java android database static

我想做的事应该很简单: 我正在尝试使用Android Studio读取XML文件并将数据写入数据库。

我的代码的简化版本如下:

MainActivity.java:

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        try {
            XMLReader r = new XMLReader();
            r.Reader(getXML());
        } catch (XmlPullParserException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //Creates each station
    public void newStation(int stationID, String stationName)
    {
        DBHandler dbHandler = new DBHandler(this, null, null, 1);

        Station station = new Station(stationID, stationName);

        dbHandler.addStation(station);
    }

    private String getXML()
    {
        //code to get xml
        return xml;
    }
}

XMLReader.java:

public class XMLReader {
    public void Reader (String xmlFile) throws XmlPullParserException, IOException
    {
        String[] stationData = new String[]{"",""};
        //code to cut xml file up and put it into stationData
        MainActivity.newStation(Integer.parseInt(stationData[0]), stationData[1]);
    }
}

(如果你想我也可以为station.java和DBHandler.java添加代码)

现在我遇到的问题是:“非静态方法'newStation(int,java.lang.String)'无法从静态上下文引用”

并且建议告诉我将newStation设为静态,但如果我这样做,那么我就会遇到这个问题:“'... MainActivity.this'无法从静态上下文中引用”

建议告诉我让newStation不是静态的......

据我所知,newStation需要是静态的,以便我将变量传递给它,但是我不能在静态的类中使用上下文'this'。我尝试创建一个上下文,但感觉就像是想把自己挖出一个洞。

我如何解决这个编程悖论?我通常能够在这里找到任何问题的答案,但这是我第一次做不到。如果您知道我错过了解决方案的链接,请在下面发布。非常感谢。

2 个答案:

答案 0 :(得分:1)

您正在使用

MainActivity.newStation(...)

如果newStation(...)方法定义为static,您只能这样做,例如:

public static void newStation()

您可以以非静态方式访问它:

activity.newStation(...)

其中activity是对MainActivity对象的引用。您可以将MainActivity的引用作为参数传递给XMLReader构造函数,例如:

public class XMLReader {
     MainActivity activity;
     public XMLReader(MainAcrivity activity){
         this.activity = activity;
     }

     ...
}

MainActivity.java

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {

    try {
        XMLReader r = new XMLReader(this);
        r.Reader(getXML());
    } catch (XmlPullParserException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

答案 1 :(得分:1)

您已拥有MainActivity类型的对象。这个是调用读取XML的方法。

顺便说一句,请坚持Java Code Conventions并使用小写字母开始方法名称。此外,方法始终做某事,因此它们应该是动词

public class XMLReader {
    public void read (String xmlFile) ...
}

最简单的方法是返回已解析的数据并从newStation内部调用MainActivity方法:

public class XMLReader {
    public String[] read (String xmlFile) throws XmlPullParserException, IOException {
        String[] stationData = new String[]{"",""};
        //code to cut xml file up and put it into stationData
        return stationData;
    }
}

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        try {
            XMLReader r = new XMLReader();
            String[] stationData = r.read(getXML());
            newStation(Integer.parseInt(stationData[0]), stationData[1]);
        } catch (XmlPullParserException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void newStation(int stationID, String stationName) { ... }
    private String getXML() { ... }
}