2015-06-07 100 views
0

我想要做的應該很簡單: 我試圖使用Android Studio讀取XML文件並將數據寫入數據庫。Java - 非靜態方法不能從靜態環境中引用

我的代碼的簡化版本是這樣的:

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」。我試圖創建一個上下文,但感覺就像試圖挖掘自己的洞。

我該如何解決這個編程悖論?我通常能夠在這裏找到任何問題的答案,但這是我第一次不能。如果您知道與我錯過的解決方案的鏈接,請在下面發佈。非常感謝。

+0

您在相同的Activity類中定義了「XMLReader」類的位置? – Pankaj

+0

而且你不能調用一個Activity類的方法,比如YourActivity.YouActivityMethod() – Pankaj

+0

[可能的原因是「無法從靜態上下文中引用非靜態方法」的原因是什麼?](http://stackoverflow.com/問題/ 290884 /這是什麼原因背後的非靜態方法,不能從靜態引用) – Cristik

回答

1

你已經擁有MainActivity類型的對象。這是調用該方法來讀取XML。

順便說一句,請堅持Java Code Conventions並以小寫字母開始方法名稱。此外,始終方法做一些事情,所以他們應該是動詞

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

來解決最簡單的方法是從內部MainActivity返回所分析的數據,並調用newStation方法:

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() { ... } 
} 
+0

Phhh ... Downvoter:敢於發表評論嗎? – Seelenvirtuose

+0

謝謝Seelenvirtuose,如果我有名譽,我會高興。我按照你的建議修正了我的方法名稱。 – L3monsta

1

您正在使用

MainActivity.newStation(...) 

你只能做,如果newStation(...)方法被定義爲static,如:

public static void newStation() 

您可以在非靜態的方式訪問它:

activity.newStation(...) 

其中activity是對的引用對象。您可以傳遞給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(); 
    } 
} 
+0

使方法靜態是不可能的。 'newStation'方法使用當前的'MainActivity'實例('this')作爲另一個調用的參數。另一個建議將起作用,但是他從哪裏獲得實例? – Seelenvirtuose

+0

@Seelenvirtuose我從來沒有建議他應該使靜態方法,我只是解釋錯誤,他可以將參考作爲參數傳遞給構造函數,這是他的決定。 – Titus

+0

好的,如果那不是你的意圖,那麼你的答案就不清楚了。你應該修改它以使它更清晰。至於第二部分:OP顯然是編程新手。留給他一個他無法看到並明確要求的選擇並不適合一個好的答案。請更新,我會刪除我的downvote。 – Seelenvirtuose

相關問題