2015-06-07 3 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 должна быть статичной для того, чтобы передать мне переменные, однако я не могу использовать контекст «это» в статическом классе. Я попытался создать контекст, но мне казалось, что он пытается выкопать себя из ямы.

Как я могу обойти этот парадокс программирования? Обычно я могу найти ответ на любой вопрос здесь, но это первый раз, когда я не мог. Если вы знаете ссылку на решение, которое я пропустил, отправьте его ниже. Большое спасибо.

+0

Где вы определили класс XMLReader в том же классе Activity ??? – Pankaj

+0

И вы не можете вызвать метод класса Activity, такой как YourActivity.YouActivityMethod() – Pankaj

+0

Возможный дубликат [В чем причина «нестатического метода нельзя ссылаться из статического контекста»?) (Http://stackoverflow.com/ Вопросы/290884/what-is-the-reason-behind-non-static-method-not-be-reference-from-a-static) – Cristik

ответ

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

Phhh ... Downvoter: Не смей прокомментировать? – Seelenvirtuose

+0

Спасибо Seelenvirtuose, я бы поднял голову, если бы у меня была репутация. Я исправил имена своих методов, как вы предложили. – L3monsta

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

Невозможно сделать статический статический метод. Метод 'newStation' использует текущий экземпляр' MainActivity' ('this') в качестве аргумента для другого вызова. Другое предложение будет работать, но откуда он получает экземпляр? – Seelenvirtuose

+0

@Seelenvirtuose Я никогда не предлагал ему сделать метод 'static', я просто объяснял ошибку, и он может передать ссылку на активность в качестве параметра конструктору, то есть его решение. – Titus

+0

Хорошо, если это не ваше намерение, тогда из вашего ответа не ясно. Вы должны изменить его, чтобы сделать его более понятным. Что касается второй части: OP, очевидно, новичок в программировании. Оставив его, выбор, который он не видит и явно просит, не подходит для хорошего ответа. Пожалуйста, уточните, и я удалю свой нижний план. – Seelenvirtuose

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