Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для мобильных телефонов > Android

Android Разработка игр на платформе Android

Ответ
 
Опции темы
Старый 07.05.2015, 02:56   #1
Leowey
Знающий
 
Аватар для Leowey
 
Регистрация: 08.11.2010
Адрес: Москва
Сообщений: 285
Написано 78 полезных сообщений
(для 182 пользователей)
ArrayList() не увеличивается в размере при добавлении нового элемента

Мои бессонные ночи

Доброй ночи, булка!

Ситуация следующая:
Пришел ко мне как-то приятель и попросил написать лог для приложения на андроид. В принципе, казалось бы, ничего сложно (хоть я и знаком с жабой еле-еле) - создал файл да записал все собранные данные в него... А вот фиг.
При добавлении нового элемента в ArrayList() новый элемент записывается поверх предыдущего.
С обычными (с фиксированным количеством элементов) так же.
Пробовал создавать отдельный проект и написать пример с массивом с нуля - всё работает.
Вот код MainActivity, где, в принципе, всё происходит:
http://pastebin.mozilla-russia.org/111911
Или под катом:

package com.NFCProject;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.nfc.NfcAdapter;
import android.os.Bundle;
import android.os.Environment;
import android.widget.Toast;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.ArrayList;




/* Класс Internet, наследник класса AsyncTask. 
 * AsyncTask - системный класс для выполнения 
 * тяжелых задач и передача в UI-поток результатов работы.
 * В классе Internet выполняется запрос на сервер
 * Класс HexUtils содержит всего один метод для 
 * перевода байтов в строку
 * InternetListener - интерфейс, используемый в 
 * качестве слушателя окончания задачи в классе Internet
 */
public class MainActivity extends Activity implements InternetListener
{
//    private final static String FILENAME = "secOn_log.txt"; // имя файла
//    private static final String LOG_TAG = "SecOn_log";
    
    
Context context this;
    
NfcAdapter adapter;
    
Internet internet_conn;
    
String id;

    
    
//Массивы с данными от меток
   
ArrayList<Stringtag = new ArrayList<String>();
   
ArrayList<Stringtagid = new ArrayList<String>();
   
ArrayList<Stringtagtime = new ArrayList<String>();
    
    
    
//Данные для запимси файла
    
final String DIR_SD "Secоn";
    final 
String FILENAME_SD "fileSD";    
    

    @
Override
    
public void onCreate(Bundle savedInstanceState){
        
super.onCreate(savedInstanceState);
        
setContentView(R.layout.main); //
    
adapter NfcAdapter.getDefaultAdapter(this);
    
onNewIntent(getIntent()); 
    }
    
    

    
    @
Override
    
protected void onNewIntent(Intent intent){
    if(
NfcAdapter.ACTION_TAG_DISCOVERED.equals(intent.getAction()) || NfcAdapter.ACTION_TECH_DISCOVERED.equals(intent.getAction())){
        
byte[] msgs intent.getByteArrayExtra(NfcAdapter.EXTRA_ID);
        
id HexUtils.bytesToHexString(msgs); 
        
internet_conn = new Internet(this);
        
internet_conn.execute(id);
        
addTagToList(id);
        }
    
    }

    @
Override
    
public void onRequestFinished(){
         
writeFileSD();
    }

    

    
//Этот метод возвращает текущую дату и время
    
private String getDateTime() {
        
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy.MM.dd / HH:mm:ss");
        
Date date = new Date();
        return 
dateFormat.format(date);
    }
    
    
    
//Метод записи файла (лога) на телефон 
    
void writeFileSD() {
    
        
// проверяем доступность SD
        
if (!Environment.getExternalStorageState().equals(
            
Environment.MEDIA_MOUNTED)) {
          return;
        }
        
// получаем путь к SD
        
File sdPath Environment.getExternalStorageDirectory();
        
// добавляем свой каталог к пути
        
sdPath = new File(sdPath.getAbsolutePath() + "/" DIR_SD);
        
// создаем каталог
        
sdPath.mkdirs();
        
// формируем объект File, который содержит путь к файлу
        
File sdFile = new File(sdPathFILENAME_SD);    
      

        try {
            
            
String res_str;
            
BufferedWriter bw = new BufferedWriter(new FileWriter(sdFile));   // открываем поток для записи
            
bw.write("Лог программы. Не удаляйте его! Пожалуйста!");
            
bw.newLine();
            
bw.write("Список пройденных меток за последнее время:");
            
bw.newLine();

            for (
int i 0tag.size(); i++) { //Проходимся по массиву с данными
                
res_str tag.get(i)+" "+tagid.get(i)+" "+tagtime.get(i)+ "/n"//Соединяем из в строку        
                
bw.write(res_str); //И записываем    
                
bw.newLine();
                
//System.out.println(res_str); 
            

            
                        
            
bw.close();     
            
Toast.makeText(context"Запись завершена."Toast.LENGTH_SHORT).show();     
        } catch (
IOException e) {
          
e.printStackTrace();
        }
      }    
    
    
//Метод добавления метки в массив программы
    
void addTagToList(String tag_id){
        
tag.add("---");
        
tagid.add(tag_id);
        
tagtime.add(getDateTime());  
    }




    
    
    
    
    



В чем может быть проблема?

И ещё вопрос:

Как дописать информацию в файл, а не переписывать файл с нуля? Насколько мне известно FileWriter не открывает файл, а тупо создает его заново, вместо предыдущего. А FileReader позволяет файл соответственно только читать. Попробовать скопировать данные в буфер при чтении, а потом уже вставить их при записи нового файла?

Последний раз редактировалось Leowey, 07.05.2015 в 02:56. Причина: Ну курсив с жирным перепутал, хех
(Offline)
 
Ответить с цитированием
Старый 07.05.2015, 03:25   #2
Igor
Мастер
 
Аватар для Igor
 
Регистрация: 03.05.2010
Адрес: Подмосковье
Сообщений: 1,218
Написано 438 полезных сообщений
(для 790 пользователей)
Ответ: ArrayList() не увеличивается в размере при добавлении нового элемента

При добавлении нового элемента в ArrayList() новый элемент записывается поверх предыдущего.
Ты в этом точно уверен? Может, ошибка где-то в другом месте? Например, добавь для отладки в addTagToList строчку типа Log.d("app", "addTagToList(" + tag_id + ")"); чтобы видеть, когда и сколько раз этот метод вызывается
__________________
О¯О ¡¡¡ʁɔvʎнdǝʚǝdǝu dиW
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Leowey (07.05.2015)
Старый 07.05.2015, 03:51   #3
Leowey
Знающий
 
Аватар для Leowey
 
Регистрация: 08.11.2010
Адрес: Москва
Сообщений: 285
Написано 78 полезных сообщений
(для 182 пользователей)
Ответ: ArrayList() не увеличивается в размере при добавлении нового элемента

Сообщение от Igor Посмотреть сообщение
Например, добавь для отладки в addTagToList строчку типа Log.d("app", "addTagToList(" + tag_id + ")"); чтобы видеть, когда и сколько раз этот метод вызывается
Не уверен вообще нифига.

Добавил. Метод вызывается ровно тогда, когда нужно ровно 1 раз.

Фрагмент лога под катом (если он вдруг нужен)




Надо время записи прикрутить, для наглядности.
Ап. Лол. Не заметил, что сам лог это делает. :D

С временем:



Последний раз редактировалось Leowey, 07.05.2015 в 04:02. Причина: Добавил лог
(Offline)
 
Ответить с цитированием
Старый 07.05.2015, 04:21   #4
Igor
Мастер
 
Аватар для Igor
 
Регистрация: 03.05.2010
Адрес: Подмосковье
Сообщений: 1,218
Написано 438 полезных сообщений
(для 790 пользователей)
Ответ: ArrayList() не увеличивается в размере при добавлении нового элемента

хм, у меня есть подозрения, что дело в многопоточности.
Попробуй поменять arrayList на Vector или обращаться к нему только в блоке synchronized(tag){
...
}
__________________
О¯О ¡¡¡ʁɔvʎнdǝʚǝdǝu dиW
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 12:03.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com