JavaRush/Java блог/Архив info.javarush/нужна помощь по android
Samson
19 уровень

нужна помощь по android

Статья из группы Архив info.javarush
участников
суть проблемы, есть layout, в котором запускается SAX парсер, и с инета вытягивает данные курсы валют. когда добавляю в ListView прога не запускается, а когда вывожу в консоль даные есть, помогите пожалуйста найти где ошибка. (XML образец для ListView создал это my_list_items_currensy) public class ShowAllActivity extends AppCompatActivity { private ArrayList finalList; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.list_layout); SAXParserFactory saxParserFactory = SAXParserFactory.newInstance(); try { URL url = new URL("http://resources.finance.ua/ua/public/currency-cash.xml"); InputStream stream = url.openStream(); SAXParser saxParser = saxParserFactory.newSAXParser(); // creating a SAX parser Handler handler = new Handler(); saxParser.parse(stream,handler); // here we parse our resource finalList = handler.getListOfAllCurrencies(); } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } adapterList(); } public void adapterList(){ ArrayAdapter arrayAdapter = new ListOfAllCurrency(); ListView listView=(ListView)findViewById(R.id.c_list); listView.setAdapter(arrayAdapter); } public class ListOfAllCurrency extends ArrayAdapter { public ListOfAllCurrency() { super(ShowAllActivity.this,R.layout.my_list_items_currensy,finalList); } @Override public View getView(int position, View convertView, ViewGroup parent) { View view = convertView; if( view==null){ view = getLayoutInflater().inflate(R.layout.my_list_items_currensy,parent,false); } TextView bankName = (TextView)view.findViewById(R.id.bankName); TextView currency = (TextView)view.findViewById(R.id.currency); TextView bay = (TextView)view.findViewById(R.id.bay); TextView sell = (TextView)view.findViewById(R.id.sell); bankName.setText(finalList.get(position).getBankName()); StringBuilder itemsString = new StringBuilder(); int lengthListOfCurrency = finalList.get(position).getList().size(); for(int i=0;i
Комментарии (12)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
LostMichael1987
Уровень 41
27 сентября 2016, 09:49
Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference
Ошибка в ShowActivity.onCreate. Инициализировать лист нужно до setContentView, т.к. то, чем ты его инициализируешь, не успевает распарситься.
Сделай ASyncTask все же, его проще реализовать чем Loader, куда в doInBackground помести весь код распарсивания, кроме последней строчки, а в onPostExecute пускай возвращает лист handler.getListOfAllCurrencies(). Такие вещи как парсинг рекомендуется делать в отдельной нити.
Samson
Уровень 19
27 сентября 2016, 15:28
прочел про ASyncTask что оно не ефективно если делаешь переход на другой Activity, она слетает, а какая есть альтернатива ASyncTask?
Samson
Уровень 19
27 сентября 2016, 15:34
у меня должно запускаться на первом Activity парсер, потом вибор через кнопки Activity или show_all или choose_bank
LostMichael1987
Уровень 41
27 сентября 2016, 21:24
например, классы Loader (LoaderManager.LoaderCallbacks), Service.
LostMichael1987
Уровень 41
27 сентября 2016, 21:29
не понял. Если данные загружаются в одной активити и будут передаваться в другую? лучше сразу во второй тогда доставать данные, если в первой не используются.
Если фильтрация и данные на сервере обновляются нечасто, можно как вариант распарсивать и сохранять в БД (SQLite идет в комплекте, Realm ставить дополнительно) и оттуда уже тянуть.
Если эти кнопки и парсер в одной активити, то можно по нажатии на кнопку фильтровать соответствующе список валют и уведомлять об этом адаптер (adapter.notifyDataChanged()).
Samson
Уровень 19
29 сентября 2016, 12:57
есть проблема с AsyncTask, при компиляции список банков в консоль выводит все 91, но в приложении первых 5 копирует и повторяет их 91 раз.
public class SitesDownload extends AsyncTask<Void,Void,Void> {

        @Override
        protected Void doInBackground(Void... params) {
            Log.i("myLogs", "start parsing");
                Parsing downloader = new Parsing();
                downloader.parser("http://resources.finance.ua/ua/public/currency-cash.xml");
            Log.i("myLogs", "end parsing"+Parsing.getFinalList().size());
            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            Log.i("myLogs", "start add to adapter");
            adapter = new AdapterListOfAllCurrency(ShowAllActivity.this,R.layout.my_list_items_currensy,Parsing.getFinalList());
            Log.i("myLogs", "add adapter to c_List");
            c_List.setAdapter(adapter);
            Log.i("myLogs", "adapter size = "+ adapter.getCount());

        }
    }

public class AdapterListOfAllCurrency extends ArrayAdapter<AllCurrency> {

    public AdapterListOfAllCurrency(Context ctx, int textViewResourceId, List<AllCurrency> sites) {
        super(ctx, textViewResourceId, sites);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        RelativeLayout row = (RelativeLayout)convertView;
        Log.i("myLogs", "getView pos = " + position);
        if(row==null){
            LayoutInflater inflater = (LayoutInflater) parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            row = (RelativeLayout)inflater.inflate(R.layout.my_list_items_currensy, null);

            TextView bankName = (TextView)row.findViewById(R.id.bankName);
              TextVie
LostMichael1987
Уровень 41
29 сентября 2016, 15:00
АSyncTask посмотри как реализовывать. Этот класс генерик, ему можно передать на вход строку например и после выполнения получить результат. Проверь дебагом, что в итоге с парсера, что передается в адаптер, код у адаптера в getView(), конкретнее — цикл. Где-то ошибка
Samson
Уровень 19
30 сентября 2016, 16:33
я заменил RelativeLayout row = (RelativeLayout)convertView; на View view = convertView и с view работал и проканало
LostMichael1987
Уровень 41
26 сентября 2016, 10:02
Что за ошибка вылетает, стек трейс? Наугад скажу, что у тебя данные парсятся при создании view, не успев распарситься уже грузятся в layout.
Парсер лучше запускать в отдельном треде, используй для этого ASyncTask(сейчас не рекомендуется, но если проект учебный или тестовый, то можно) или Loader.
p.s. ListView тоже сейчас чаще заменяется RecyclerView — то же самое что ListView, но с обязательным ViewHolder`ом.
Samson
Уровень 19
26 сентября 2016, 21:20
на телефоне на жаль Exchange зупинено, а в консоле нет ошыбок
Samson
Уровень 19
27 сентября 2016, 00:10
FATAL EXCEPTION: main
Process: com.example.yura.application, PID: 24646
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.yura.application/com.example.yura.application.ShowAllActivity}: java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2331)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2391)
at android.app.ActivityThread.access$800(ActivityThread.java:151)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1309)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5349)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:908)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:703)
Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference
at android.widget.ArrayAdapter.getCount(ArrayAdapter.java:330)
at android.widget.ListView.setAdapter(ListView.java:487)
at com.example.yura.application.ShowAllActivity.adapterList(ShowAllActivity.java:53)
at com.example.yura.application.ShowAllActivity.onCreate(ShowAllActivity.java:35)
at android.app.Activity.performCreate(Activity.java:6020)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2284)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2391) 
at android.app.ActivityThread.access$800(ActivityThread.java:151) 
at android.app.ActivityThread$H.handl
Samson
Уровень 19
26 сентября 2016, 02:09
это образец my_list_items_currensy