2012-02-16 2 views
0

Итак, я делаю приложение для Android, которое может отправлять SMS-сообщения несколько раз с интервалами между количеством сообщений. Это частично работает, но иногда это не так. Например, когда я ввожу 20 msgs для отправки, он отправляет 16 или, может быть, немного больше. Также, когда я нажимаю кнопку, она зависает до тех пор, пока она не закончит отправку SMS'а. Так или иначе, кто-то может сказать мне, что не так с моим кодом? Я пробовал несколько исправлений, которые не работают очень хорошо, и я думал, что приеду сюда за помощью после многих неудачных попыток. PS там больше кода, но это то, где проблема остается. Спасибо за чтение EDIT: FIXED!Android Отключенный код отправки SMS

ответ

1

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

Я бы посмотрел AsyncTask. Это способ Android легко прорисовать. По сути, что бы вы сделали, это создаст новый поток в фоновом режиме с помощью AsyncTask. Это освобождает поток пользовательского интерфейса, чтобы он выглядел так, как будто все нормально для пользователя (без замораживания), в то время как AsyncTask выполняет всю работу в фоновом режиме с помощью doInBackground. Затем, когда Задача выполнена, используйте onPostExecute, чтобы уведомить пользовательский интерфейс, что это сделано, и, возможно, рассказать пользователю что-то. Вы поместили бы вызов MyAsyncTask.execute(smsDataHere) в onClick.

Эта ссылка на AsyncTask достаточно проста для простых целей и имеет пример кода.

Я не уверен точно почему он отправляет только 16 сообщений, но я сразу вижу, что вам не хватает фигурных скобок и что они не совсем совпадают с тем, как вы их хотите к. Я бы посмотрел туда первым. Кроме того, есть ли причина для второго цикла for? size всегда 1, поэтому он просто отправляет каждое сообщение дважды.

EDIT: Вот пример кода. Я не собираюсь обещать, что он работает в вашем точном приложении, но он покажет вам, как работает AsyncTask и дает вам отправную точку. Я также пытался решить любые проблемы с фигурными фигурными скобками и немного очистился. Я по-прежнему рекомендую просмотреть документацию, чтобы убедиться, что вы понимаете, как она работает. Я надеюсь, это поможет вам.

public void onClick(View v){     
    String phoneNo = putpn.getText().toString(); 
    String message = txtMessage.getText().toString(); 
    String txts = txtAmount.getText().toString(); 
    String inter = interval.getText().toString(); 

    if (msgCount > 21){ 
     Toast.makeText(getBaseContext(), "That is too many txts, the max is 20", Toast.LENGTH_SHORT).show(); 
    } 
    else{ 
     MySmsTask.execute(phoneNo, message, txts, inter); 
    } 
} 

private class MySmsTask extends AsyncTask<String, Void, Integer> { 
    @Override 
    protected Integer doInBackground(String... messageData) { 
     int sentCount = 0; 
     int size = 1; 
     int delay = Integer.parseInt(messageData[3]); 
     int msgCount = Integer.parseInt(messageData[2]); 

     if (phoneNo.length()>0 && message.length()>0){ 
      for (sentCount = 0; sentCount < msgCount; sentCount++) { 
       for (int i = 0; i < size; i++) { 
        sendSMS(messageData[0], messageData[1]); 
        Thread.sleep(delay * 1000); 
       } 
      } 
     } 
     return sentCount; 
    } 

    @Override 
    protected void onPostExecute(Integer result) { 
     Toast.makeText(getBaseContext(), "Sent " + sentCount + " messages", Toast.LENGTH_SHORT).show(); 
    } 
} 

private void sendSMS(String phoneNumber, String message){   
    PendingIntent pi = PendingIntent.getActivity(this, 0, 
      new Intent(this, Object.class), 0); 
    SmsManager sms = SmsManager.getDefault(); 
    sms.sendTextMessage(phoneNumber, null, message, null, null); 
} 
+0

OK Я попробую то, что вы предложили, и реализуйте Asynctask вместо Thread. также я получаю синтаксические ошибки там, но я запутался, потому что я не вижу ошибок, кроме скобок. – Kebob

+0

Также могу попросить вас показать пример того, как я буду делать doInBackground (метод?)? и что именно я мог бы ввести в метод MyAsynctask? извините im действительно новый с java/android, и это мое первое приложение. – Kebob

+0

также шаги, которые я думаю. 1.do a onPreExecute для индикатора выполнения 2.make класс MyAsyncTas (не знаю точно, что добавить сюда) 3.make doInBackground для запуска класса Async? 4. Затем позвоните (я не знаю, что бы я назвал здесь, doInBackground)? 5.run onPostExecute – Kebob

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