Приложение веб-камеры перестает работать после случайного времени
Извините, если в моей программе появилась основная ошибка или что-то подобное, но я довольно новичок в Android. Я создал приложение, чтобы сделать фотографию через определенное время, сохранить ее и затем загрузить на сервер. Я использовал BackgroundService для загрузки, но я не совсем уверен, что он создан правильно. Проблема в том, что приложение всегда закрывается после случайного времени, и я не могу понять, почему это происходит. Был бы очень рад некоторым идеям или предложениям, как решить эту проблему, спасибо!
Мой таймер
public void timedWebcam()
{
Timer myTimer = new Timer();
//Initialize the Timer Task
WebcamTimer webcamTimer = new WebcamTimer();
if(intervall != 0)
{
//Starting the Timer
myTimer.scheduleAtFixedRate(webcamTimer, 0, 60000*intervall);
}
else
{
Toast.makeText(this, "interval not set", Toast.LENGTH_LONG).show();
}
}
WebcamTimer
private class WebcamTimer extends TimerTask
{
@Override
public void run()
{
runOnUiThread(new Runnable()
{
@Override
public void run()
{
Date date = new Date();
Calendar calendar = GregorianCalendar.getInstance();
calendar.setTime(date);
actualHour = calendar.get(Calendar.HOUR_OF_DAY);
System.out.println("Actual Hour= "+actualHour);
System.out.println("Start Time= "+startTime);
System.out.println("Stop Time= "+stopTime);
if( (actualHour >= startTime) && (actualHour < stopTime) )
{
takePhoto(); //Takes the Picture
uploadToFTP(); //Uploads taken Picture to FTP
}
else
{
nightMode();
}
}
});
}
}
Сервисный звонок
Intent intent = new Intent(this,UploadService.class);
this.startService(intent);
Наконец, класс UploadService
public class UploadService extends IntentService
{
//Server Properties
public String server = "sample.aon.at";
public int port = addPort;
public String user = "user";
public String pass = "password";
FTPClient ftpClient = new FTPClient();
public UploadService()
{
super("UploadService");
}
@Override
public IBinder onBind(Intent intent)
{
// TODO Auto-generated method stub
return null;
}
@Override
protected void onHandleIntent(Intent intent)
{
// For each start request, send a message to start a job and deliver the
// start ID so we know which request we're stopping when we finish the job
try
{
ftpClient.connect(server, port);
ftpClient.login(user, pass);
ftpClient.enterLocalPassiveMode();
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
ftpClient.changeWorkingDirectory("webcam");
// uploads file using an InputStream
File firstLocalFile = new File(MainActivity.path);
System.out.println("Path used for upload: "+MainActivity.path);
String firstRemoteFile = "webcam.jpg";
InputStream inputStream = new FileInputStream(firstLocalFile);
boolean done = ftpClient.storeFile(firstRemoteFile, inputStream);
inputStream.close();
if (done)
{
System.out.println("Upload finished");
}
}
catch (IOException ex)
{
System.out.println("Error: " + ex.getMessage());
ex.printStackTrace();
}
finally
{
try {
if (ftpClient.isConnected())
{
ftpClient.logout();
ftpClient.disconnect();
stopSelf();
}
}
catch (IOException ex)
{
ex.printStackTrace();
}
}
}
1 ответ
Я постараюсь поместить экземпляр таймера в ваш верхний класс обработчика. Я не уверен, но я предполагаю, что если вы создали экземпляр объекта Timer внутри метода, эта ссылка будет уничтожена после закрытия метода. Затем позже (GC) сборщик мусора уничтожит все ресурсы, которые были предоставлены экземпляру таймера при создании.
Поэтому создайте экземпляр таймера из высшего класса и просто вызовите timer.schedule(...) внутри метода.