Приложение веб-камеры перестает работать после случайного времени

Извините, если в моей программе появилась основная ошибка или что-то подобное, но я довольно новичок в 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(...) внутри метода.

Другие вопросы по тегам