2017-01-19 9 views
0

Я новичок в программировании на Android, и я создаю приложение, которое работает следующим образом: после получения ввода из SMS с некоторыми «командами» (в форме -COMMAND fileName), он считывает содержимое сообщения и выполняет определенные мультимедийные операции в другой деятельности приложения.Как я могу вызвать два метода в одной и той же Деятельности, которая будет работать в том же файле, но в разное время?

Проблема заключается в том, что когда в одном SMS есть команды, которые работают с одним и тем же файлом (например, «-SHOTPHOTO photo1 -SENDPHOTO photo1»), приложение вызывает оба метода для этого, но только первый выполняется правильно; другой возвращает ошибку, потому что фотография все еще не была сделана.

// onCreate of the new Activity 

// I received an Intent from an SMS Broadcast Receiver 
// The commands and file names are saved in order in command[nCommands] and files[nFiles], nCommands and nFiles are integer and represents the number of commands/file names 

for (int i = 0; i < nCommands; i++) { 
    switch (command[i]) { 
     case "-SHOTPHOTO": 
      // finds the correct file name of this command 
      shotphoto(files[j]); 
      break; 
     case "-SENDPHOTO": 
      // finds the correct file name of this command 
      sendphoto(files[j]); 
      break; 
      } 
} 

// end of onCreate 

public void shotphoto (String photoName) { 
    // standard method to take photos: calls the default camera app with startActivity 
    // takes photo and then renames it to photoName 
    // photo saved in the ExternalStorage, in my app folder 
} 

public void sendphoto(String photoName) { 
    // standard method to send email + photo: calls the default mail app with startActivity 
    // gets the photo from my app's folder in the ExternalStorage 
    // the photo is sent to the sender's mail address, which is already known 
} 

У меня нет никакой проблемы, когда две команды находятся в двух разных сообщений или при наличии, например, -SHOTPHOTO photo1 в сообщение и -SHOTPHOTO Фото2 -SENDPHOTO фото1 в другом сообщении. Я протестировал процесс контроля чтения и исправления, и у него нет проблем. Так что я думаю, что моя проблема в том, что оба метода выполняются одновременно, а sendphoto() не находит фотографию, потому что она еще не была сделана.

Некоторая идея о том, как сделать два метода синхронными, так что первая команда всегда выполняется до второго, а вторая ждет завершения первого?

Я не буду добавлять команду «-SHOTNSEND photoName», потому что это не то, что я хочу. Добавление sendphoto() в конец shotphoto() не позволит мне сделать снимок, не отправив его.

Код, который я написал здесь, является просто базовым примером реального кода, сообщите мне, если что-то неясно или что-то действительно важное отсутствует.

+0

Вместо того, чтобы делать очереди со всеми командами. И выполните следующую команду, когда первый закончен – X3Btel

+0

Спасибо за ваш ответ, я попробую его как можно скорее! –

ответ

0

Я последовал совету @ X3Btel, чтобы сделать очередь, и я решил свою проблему. Для тех, кто хочет знать, как я это сделал, вот код:

private Queue<String> qCommands; // global 

public void onCreate(...){ 
    qCommands = new ArrayDeque<>(); 
    // read SMS' text 
    qCommands.add(command[i]);  // everytime I read a command 
    // same as before but without for(i->nCommands) and switch command[i] 
    nextCommand(qCommands.poll()); 
} 

public void nextCommand(String command){ 
    if(command != null){ 
     switch (command) { 
      case "-SHOTPHOTO": 
      // finds the correct file name of this command 
      shotphoto(files[j]); 
      break; 
     case "-SENDPHOTO": 
      // finds the correct file name of this command 
      sendphoto(files[j]); 
      break; 
     } 
    } else { 
     // the queue is empty so no more commands 
} 

// both shotphoto() and sendphoto() start an Activity for result so when they have finished onActivityResult will be called 
public void onActivityResult(...){ 
    if(resultcode == SHOTPHOTO) 
     nextCommand(qCommands.poll()); 
    if(resultcode == SENDPHOTO) 
     nextCommand(qCommands.poll()); 
} 

приложение работает и не возвращает ошибку, как и раньше. Еще раз спасибо @ X3Btel за ваш ответ!

 Смежные вопросы

  • Нет связанных вопросов^_^