В Antair при разработке наших приложений BlackBerry мы часто включаем консоль отладки в сборки для наших приложений.
С консолью отладки все выходные данные отладки попадают на экран вывода, когда сборка dev выполняется в симуляторе, а когда сборка dev запускается на физическом тестовом устройстве, выходные данные отладки автоматически сохраняются и доступны для просмотра на специальный экран, который можно открыть с помощью пункта меню или кнопки. Небольшая модификация кода позволяет легко перенаправить журнал отладки в файл, отправить его по электронной почте или отправить по сетевому соединению.
Приведенный ниже код является урезанной версией консоли отладки, которую мы используем в нашей компании.
Пользоваться консолью легко. Включите код в ваш проект, заполните PERSISTENCE_GUID для вашего приложения, задайте строку TAGID , чтобы указать имя вашего приложения в журналах отладки и когда вы хотите вывести оператор отладки просто позвоните Debug.print («Здесь что-то произошло…»);
Каждая строка вывода отладки, как в окне вывода при запуске в симуляторе, так и на экране консоли отладки при просмотре на устройстве, будет содержать ваше сообщение отладки, номер потока, по которому был сделан вызов (полезно для отладки потока / пользовательского интерфейса) и дата / время оператора журнала с миллисекундной отметкой времени для профилирования производительности.
Чтобы просмотреть консоль отладки на реальном устройстве, просто вызовите pushScreen (новый AntairLogScreen ()) . На экране есть встроенный пункт меню для очистки сохраненных сообщений журнала, и он будет отображаться как обычный экран приложения.
Если вы используете препроцессор RIM для переключения между разработкой, QA и производственными сборками, вы можете просто вызвать вызов для установки Debug.ENABLED = false для всего, кроме сборок разработки, и консоль отладки будет там, когда вам нужно отладить и тихо уйти, когда она вам не нужна.
Код ниже.
// ---------------------------------------------------------------------------
// Antair Debug Log (for the BlackBerry API)
// http://www.antair.com
// ---------------------------------------------------------------------------
package com.antair.examples.debug;
import net.rim.device.api.i18n.SimpleDateFormat;
import java.util.Date;
import net.rim.device.api.collection.util.BigVector;
import net.rim.device.api.system.PersistentObject;
import net.rim.device.api.system.PersistentStore;
import net.rim.device.api.ui.MenuItem;
import net.rim.device.api.ui.component.Menu;
import net.rim.device.api.ui.component.RichTextField;
import net.rim.device.api.ui.container.MainScreen;
import net.rim.device.api.util.Persistable;
final class Debug implements Persistable
{
final static boolean ENABLED = true;
final static String TAGID = "MY_PROJECT";
final static long PERSISTENCE_GUID = /* YOUR OWN PERSISTENCE GUID */;
private BigVector _messages = new BigVector();
static String print(String str)
{
if ( Debug.ENABLED )
{
StringBuffer sb = new StringBuffer();
sb.append(TAGID);
sb.append("\n");
sb.append(Thread.currentThread().toString());
sb.append("\n");
sb.append(new SimpleDateFormat("MM/dd/yy HH:mm:ss:SSS").format(
new Date()));
sb.append("\n");
sb.append(str); sb.append("\n");
str = sb.toString();
System.out.println(str);
System.out.flush();
Debug d = load();
d._messages.addElement(str);
save(d);
}
return str;
}
static BigVector getPersistedMessages()
{
return load()._messages;
}
static void clearPersistedMessages()
{
save(new Debug());
}
private static Debug load()
{
Debug d = null;
try
{
PersistentObject po =
PersistentStore.getPersistentObject(Debug.PERSISTENCE_GUID);
synchronized(po)
{
Object obj = po.getContents();
d = (obj == null) ? new Debug() : (Debug)obj;
}
}
catch ( Exception e )
{
d = new Debug();
}
return d;
}
private static void save(Debug d)
{
try
{
PersistentObject po =
PersistentStore.getPersistentObject(Debug.PERSISTENCE_GUID);
synchronized(po)
{
po.setContents(d);
po.commit();
}
}
catch ( Exception e )
{
}
}
}
final class ClearAntairLogScreenMenuItem extends MenuItem
{
ClearAntairLogScreenMenuItem(int position)
{
super("Clear Log", position, 0);
}
public void run()
{
Debug.clearPersistedMessages();
}
}
final class AntairLogScreen extends MainScreen
{
AntairLogScreen()
{
super(MainScreen.DEFAULT_CLOSE|MainScreen.DEFAULT_MENU);
StringBuffer text = new StringBuffer();
BigVector logItems = Debug.getPersistedMessages();
for ( int i = 0 ; i < logItems.size() ; ++i )
{
text.append((String)logItems.elementAt(i) + "\n");
}
add(new RichTextField(text.toString()));
}
protected void makeMenu ( Menu menu, int instance )
{
menu.add(new ClearAntairLogScreenMenuItem(100000));
}
}