【问题标题】:Android Broken SMS sending codeAndroid Broken SMS 发送代码
【发布时间】:2012-02-16 03:51:11
【问题描述】:

好的,所以我正在制作一个 Android 应用程序,它能够多次发送短信消息,并且在发送消息量之间有间隔。这是部分工作,但有时不能。例如,当我输入 20 条消息发送时,它发送 16 条或更多。另外,当我按下按钮时,它会冻结,直到它完成发送短信。无论如何,有人可以告诉我我的代码有什么问题吗?我尝试了一些效果不佳的修复程序,并认为在多次尝试失败后我会来这里寻求帮助。 PS 还有更多的代码,但这是我相信的问题所在。谢谢阅读 编辑:已修复!

【问题讨论】:

    标签: android sms


    【解决方案1】:

    该按钮处于“冻结状态”,因为 UI 线程在腾出时间去做其他事情之前发送了所有 20 条 SMS。

    我会调查AsyncTask。这是Android轻松线程的方式。本质上,您将使用 AsyncTask 在后台生成一个新线程。这释放了 UI 线程,使用户看起来一切正常(没有冻结),而 AsyncTask 在后台使用doInBackground 完成所有工作。然后当任务完成时,使用onPostExecute 通知 UI 它已经完成,并可能告诉用户一些事情。你可以在 onClick 中调用MyAsyncTask.execute(smsDataHere)

    指向 AsyncTask 的链接对于简单的目的来说相当全面,并且有示例代码。

    我不确定 究竟为什么它只发送 16 条左右的消息,但我可以立即看出您缺少一些花括号,并且它们与你希望他们的方式。我会先看看那里。另外,第二个for 循环是否有原因? size 始终为 1,因此它只是将每条消息发送两次。

    编辑: 这是一些示例代码。我不会保证它可以在您的确切应用程序中运行,但它会向您展示 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);
    }
    

    【讨论】:

    • 好的,我会尝试你的建议并实现 Asynctask 而不是线程。我也在那里遇到语法错误,但我很困惑,因为除了括号外我没有看到任何错误。
    • 我还可以请您展示一个示例,说明我将如何制作 doInBackground(方法?)?我究竟会在 MyAsynctask 方法中添加什么?抱歉,我真的是 java/android 新手,这是我的第一个应用程序。
    • 也是我认为的步骤。 1. 为进度条做一个 onPreExecute 2. 制作 MyAsyncTas 类(不知道到底该放什么) 3. 制作一个 doInBackground 来运行 Async 类? 4.然后打电话(我不知道我会在这里打电话,doInBackground)? 5.运行onPostExecute
    • 另外,第二个 for 循环是供以后使用的。我计划最终实现一个选择超过 1 个联系人的联系人选择器。然后我将用选择的联系人数量替换大小。
    • 我会这样做:通过execute 传递电话号码、消息等,然后在doInBackground 中使用它们,其中包含您当前在大else 中所做的所有事情堵塞。然后把MyTask.execute(String[] data)放在else之后。如果您愿意,然后在onPostExecute 中向用户发送某种消息。我不会费心使用其他方法(onProgressUpdateonPreExecute)。尝试彻底阅读和理解 AsyncTask,我想你会看到它应该如何工作。您几乎可以使用他们为课程提供的相同框架,然后粘贴您的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多