2 sinat 21823453 sinat_21823453 于 2016.02.17 22:56 提问

Android 关于服务里面的AsyncTask方法问题

最近,小弟在写一个拦截短信的android 程序,在开启拦截服务这个地方被卡了好几天了,
换了好几种思路,最后参考一种网上的思路用了AsyncTask这种思路。

但是运行程序的时候报错,但是不太清楚哪里出错了,求大神帮看一看服务的这个包。


public class MsgService extends Service{
    private boolean D=true;
    private ReceiveMessage mReceiver;
     @Override
     public IBinder onBind(Intent intent) {
            // TODO Auto-generated method stub
            return null;
          }
     @Override
      public void onCreate() {
        if(D){
          Log.i("msgservice"," onCreate()");
        }
        //注册动态广播
        mReceiver=new ReceiveMessage();
        IntentFilter filter=new IntentFilter();
        filter.setPriority(Integer.MAX_VALUE);
        filter.addAction("android.provider.Telephony.SMS_RECEIVED");
        registerReceiver(mReceiver, filter);
        super.onCreate();
      }
      @Override
      public int onStartCommand(Intent intent, int flags, int startId) {
        if(D){
          Log.i("msgservice","onStartCommand");
        }
        return super.onStartCommand(intent, flags, startId);
      }
      @Override
      public void onDestroy() {
        if(D){
          Log.i("msgservice","onDestroy() ");
        }
        //取消广播接收者
        unregisterReceiver(mReceiver);
        mReceiver=null;
        super.onDestroy();
      }
     class ReceiveMessage extends BroadcastReceiver {
         private String address;
         private String fullMessage;
            private MyDatabaseHelper dbHelper;
             // 当接收到短息时被触发
             @Override
             public void onReceive(Context context, Intent intent) {

                 Bundle bundle = intent.getExtras();
                 // 判断是否有数据
                 if (bundle != null) {
                     // 通过pdus可以获得接收到的所有短信消息
                     Object[] pdus = (Object[]) bundle.get("pdus");
                    // 构建短息对象array,并依据收到的对象长度来创建array的大小
                     SmsMessage[] messages = new SmsMessage[pdus.length];
                     for (int i = 0; i < pdus.length; i++) {
                             messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
                            }
                            address = messages[0].getOriginatingAddress();//获取发送方号码
                            fullMessage = "";
                            for (SmsMessage message : messages) {
                                fullMessage +=message.getMessageBody();//获取短信内容
                            }

                            new AsyncTask<Void,Void,Void>(){
                              @Override
                              protected Void doInBackground(Void... params) {
                                return null;
                              }

                              @Override
                              protected void onPostExecute(Void result) {

                                  if(fullMessage.startsWith("Test")||fullMessage.endsWith("Test"))//发现短信,拦截,并且存入数据库
                                    {
                                      abortBroadcast();    // 取消广播(这行代码将会让系统接受短信程序收不到短息)
//入库要从新写,用AsyncTask
                                      new AsyncTask<Void,Void,Void>(){

                                          @Override
                                            protected Void doInBackground(Void... params) {
                                              //把陌生人短信存储在数据库表里
                                              SQLiteDatabase db = dbHelper.getWritableDatabase();
                                              ContentValues values = new ContentValues();
                                              values.put("phonenumber",address);
                                              values.put("content",fullMessage);
                                              db.insert("TEXT", null, values);
                                                return null;
                                          }
                                            }.execute();
                                        }
                                    super.onPostExecute(result);
                              }

                        }.execute();
                              }
                       }
             }
}

在发送一个拦截开头为Test的短息的时候,报错如图:

图片说明

图片说明

4个回答

zrf1335348191
zrf1335348191   2016.02.17 23:38
已采纳

日志里caused by原因是空指针,程序97行,空指针好解决,断点看看怎么空了

sinat_21823453
sinat_21823453 程序第97行是 SQLiteDatabase db = dbHelper.getWritableDatabase(); 我设置断点看了看,没看明白。。。。
接近 2 年之前 回复
caozhy
caozhy   Ds   Rxr 2016.02.18 05:28

new AsyncTask(){

                                      @Override
                                        protected Void doInBackground(Void... params) {
                                          //把陌生人短信存储在数据库表里
                                          SQLiteDatabase db = dbHelper.getWritableDatabase();
                                          ContentValues values = new ContentValues();
                                          values.put("phonenumber",address);
                                          values.put("content",fullMessage);
                                          db.insert("TEXT", null, values);
                                            return null;
                                      }
                                        }.execute();
                                                                    这是异步执行的
                                                                    super.onPostExecute(result);这里result可能为null
sinat_21823453
sinat_21823453 我把result换成null ,模拟短信发送还是出现这个问题。
接近 2 年之前 回复
Royal_lr
Royal_lr   Ds   Rxr 2016.02.18 09:46

断点看下97行是怎么执行的,

hwhzyy
hwhzyy   2016.02.19 17:14

dbHelper没有初始化吧。
你在广播里设置了变量private MyDatabaseHelper dbHelper;
但是后面没找到你有初始化。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!