Пресеты в эквалайзере

Ответить
DevSergio
Сообщения: 37
Зарегистрирован: 22 янв 2013, 19:51
Откуда: Kharkov

Пресеты в эквалайзере

Сообщение DevSergio » 04 июн 2013, 10:36

Очень странная ситуация возникла при разработке эквалайзера. За основу взят проект https://github.com/lavakian/Aurem.
Есть функция loadPresetClicked(View v) которая вызывалась по кнопке , нужно сделать чтобы вызов был без нажатия по кнопке то есть просто loadPresetClicked(). И когда так делаю вылетает NullPointerException.
Вот сама функция :

Код: Выделить всё

public void loadPresetClicked() {
		String[] names = new String[10 + model.getPresets().size()];
		for (int i = 0; i < 10; i++) {
			names[i] = eqService.equalizer().getPresetName((short) i);
		}
		for (short i = 0; i < model.getPresets().size(); i++) {
			names[i + 10] = model.getPresets().get(i).getName();
		}

		this.onSaveInstanceState(new Bundle());

	}
Модель :

Код: Выделить всё

public class EqualizerModel extends Observable {
	private ArrayList<Preset> presets;
	private Scanner inStream;
	private PrintWriter outStream;
	private EqualizerActivity parent;
	private short[] bandLevels;

	public EqualizerModel(EqualizerActivity parent) {
		presets = new ArrayList<Preset>();
		this.parent = parent;
		bandLevels = new short[5];
	}

	public void writePresetFile() {
		File directory = new File("/sdcard/Aurem/");
		directory.mkdirs();
		File outputFile = new File(directory, "presets.txt");
		FileOutputStream outputStream;
		String output = "";
		try {
			outputStream = new FileOutputStream(outputFile);
			outStream = new PrintWriter(outputStream);
		} catch (IOException e) {
			System.out.println(e.getMessage());
		}
		for (int i = 0; i < presets.size(); i++) {
			short index = (short) i;
			Preset preset = presets.get(index);

			output += preset.index() + ",";
			short[] bands = preset.getBands();
			for (int j = 0; j < 5; j++) {
				output += bands[j] + ",";
			}
			output += preset.getName() + "\n";
		}
		outStream.print(output);
		outStream.close();
	}

	public void writeLastStateFile() {
		File directory = new File("/sdcard/Aurem/");
		directory.mkdirs();
		File outputFile = new File(directory, "lastState.txt");
		FileOutputStream outputStream;
		String output = "";
		try {
			outputStream = new FileOutputStream(outputFile);
			outStream = new PrintWriter(outputStream);
		} catch (IOException e) {
			System.out.println(e.getMessage());
		}
		for (short i = 0; i < bandLevels.length; i++) {
			output += bandLevels[i] + "\n";
		}
		outStream.print(output);
		outStream.close();
	}

	public void readLastStateFile() {
		FileInputStream inputStream;
		try {
			inputStream = new FileInputStream("/sdcard/Aurem/lastState.txt");
			inStream = new Scanner(inputStream);
		} catch (IOException e) {
			System.out.println(e.getMessage());
		}
		inStream.useDelimiter("\n");
		for (short i = 0; i < 5; i++) {
			bandLevels[i] = Short.parseShort(inStream.nextLine());
		}
		inStream.close();
	}

	public void readPresetFile() {
		FileInputStream inputStream;
		try {
			inputStream = new FileInputStream("/sdcard/Aurem/presets.txt");
			inStream = new Scanner(inputStream);
		} catch (IOException e) {
			System.out.println(e.getMessage());
		}
		inStream.useDelimiter("\n");
		while (inStream.hasNext()) {
			String line = inStream.next();
			String[] data = line.split(",");
			short index = Short.parseShort(data[0]);
			short[] bands = new short[5];
			Preset preset = new Preset(index, data[6]);
			for (int i = 1; i < 6; i++) {
				bands[i - 1] = Short.parseShort(data[i]);
			}
			preset.setBands(bands);
			for (int i = 0; i < presets.size(); i++)
				Log.d("Preset", presets.get(i) + "");
			presets.add(index, preset);
		}
		inStream.close();
	}

	public Preset getPreset(short index) {
		return presets.get(index);
	}

	public void setBandLevel(short index, short bandLevel) {
		bandLevels[index] = bandLevel;
		setChanged();
		notifyObservers();
	}

	public short getBandLevel(short index) {
		if (index < 0 || index >= bandLevels.length) {
			return 0;
		}
		return bandLevels[index];
	}

	public void createPreset(String name, short[] bands) {
		int index = presets.size();
		Preset preset = new Preset((short) (index), name);
		preset.setBands(bands);
		presets.add(preset);
	}

	public ArrayList<Preset> getPresets() {
		return presets;
	}

}
И сам сервис :

Код: Выделить всё

public class EqualizerService extends Service {
	
	private final ServiceBinder binder = new ServiceBinder();
	private Equalizer eq;

	@Override
	public void onCreate() {
		super.onCreate();

		eq = new Equalizer(1000000, 0);
		for (short i = 0; i < 5; i++) {
			eq.setBandLevel(i, (short) 0);
		}
		eq.setEnabled(true);
	}

	public int onStartCommand(Intent intent, int flags, int startId) {
		super.onStartCommand(intent, flags, startId);
		return START_STICKY;
	}

	@Override
	public IBinder onBind(Intent arg0) {
		return binder;
	}

	@Override
	public void onDestroy() {
		super.onDestroy();
	}

	public Equalizer equalizer() {
		return eq;
	}

	public class ServiceBinder extends Binder {
		EqualizerService getService() {
			return EqualizerService.this;
		}
	}

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

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Пресеты в эквалайзере

Сообщение KamiSempai » 04 июн 2013, 12:35

Вы бы хоть написали в какой строке ошибка.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

DevSergio
Сообщения: 37
Зарегистрирован: 22 янв 2013, 19:51
Откуда: Kharkov

Re: Пресеты в эквалайзере

Сообщение DevSergio » 04 июн 2013, 12:35

Уже понял в чем ошибка , но не знаю как ее решить .
names = eqService.equalizer().getPresetName((short) i);
Сервис eqService в данной строчке равен Null , значит сервис не стартует как это можно решить?
Хотя стартую сервис в главном активити , а потом вызываю loadPresetClicked()

Код: Выделить всё

intent = new Intent(this, EqualizerService.class);
		startService(intent);
		bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);
		isServiceOn = true;

		loadPresetClicked();

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Пресеты в эквалайзере

Сообщение KamiSempai » 04 июн 2013, 12:41

Очевидно, стоит дождаться запуска сервиса перед вызовом метода.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

DevSergio
Сообщения: 37
Зарегистрирован: 22 янв 2013, 19:51
Откуда: Kharkov

Re: Пресеты в эквалайзере

Сообщение DevSergio » 04 июн 2013, 12:51

Хм , ну добавил проверку. Теперь в onCreate проверяю

Код: Выделить всё

private boolean isMyServiceRunning() {
		ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
		for (RunningServiceInfo service : manager
				.getRunningServices(Integer.MAX_VALUE)) {
			if ("com.musicplayer.eq.EqualizerService".equals(service.service
					.getClassName())) {
				return true;
			}
		}
		return false;
	}

Код: Выделить всё

	if (isMyServiceRunning() == true)
			loadPresetClicked();
Результат один и тот же.

Аватара пользователя
KamiSempai
Сообщения: 1339
Зарегистрирован: 17 фев 2012, 21:23
Откуда: Мордор

Re: Пресеты в эквалайзере

Сообщение KamiSempai » 04 июн 2013, 14:45

Перечитайте уроки с 92 по 100, возможно станет понятно как решить эту проблему.
R.id.team
Хватит таскать макулатуру на тренировку! Используй T Note.

DevSergio
Сообщения: 37
Зарегистрирован: 22 янв 2013, 19:51
Откуда: Kharkov

Re: Пресеты в эквалайзере

Сообщение DevSergio » 04 июн 2013, 20:00

Решилась проблема , нужно было вызывать метод в onServiceConnected().

Ответить