当前位置:编程学习 > wap >>

AppWidget 开发 所遇到的一个方法调用问题

这是个4.2 环境下开发的 音乐播放器   在写widget 桌面小部件的时候出了问题  
我在onEnable和onUpdate两个方法中都先打开service  然后进行歌曲的列表更新 (具体见代码)
但是实际的执行效果有两种
一、在4.2.2的模拟器上运行   结果正常  小部件能正常使用
二、在实体机上运行  版本为4.0.4 和2.3.7 ,小部件都不能运行  报错 空指针异常    异常的原因是在更新列表的时候发现service没有被打开(或者没有执行onCreat方法)导致一个对象为空。

关键代码如下:

MusicWidget.java
intent_server=new Intent();
intent_server.setClass(context.getApplicationContext(), MusicPlayerService.class);
context.getApplicationContext().startService(intent_server);//启动服务
System.out.println("service is started");
ServiceManager mServiceManager = ServiceManager.getInstance();//获得ServiceManager的实体(单例)
Context app_ctx = context.getApplicationContext();//(获得该应用的上下文联系)
//注册由serviceManager接收的广播
IntentFilter intentFilter = new IntentFilter("com.music.service.create");
intentFilter.addAction("PLAY_SERVICE");
intentFilter.addAction("PAUSE_SERVICE");
intentFilter.addAction("PRE_SERVICE");
intentFilter.addAction("NEXT_SERVICE");
//intentFilter.addAction(action)
app_ctx.registerReceiver(mServiceManager, intentFilter);
//注册由onReceive接收的广播
IntentFilter intentFilter_img= new IntentFilter("com.music.brocast");
app_ctx.registerReceiver(this, intentFilter_img);
IntentFilter intentFilter_play= new IntentFilter("WIDGET_PLAY");
app_ctx.registerReceiver(this, intentFilter_play);
IntentFilter intentFilter_pre= new IntentFilter("WIDGET_PRE");
app_ctx.registerReceiver(this, intentFilter_pre);
IntentFilter intentFilter_next= new IntentFilter("WIDGET_NEXT");
app_ctx.registerReceiver(this, intentFilter_next);
/* PendingIntent Pintent_server = PendingIntent.getService(context, 0, intent_server, 0);
AlarmManager alarm=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);  
        alarm.setRepeating(AlarmManager.RTC,0,1000 , Pintent_server);  */
        //context.getApplicationContext().startService(intent_server);//启动服务
        System.out.println("regist is over");
AllMusicDAO musicDAO=new AllMusicDAO(app_ctx);
List<MusicData> list =musicDAO.getMusicListData();//连接数据库
System.out.println(list.size());
mServiceManager.refreshMusicList(list);//更新播放列表


ServiceManager.java
	public void refreshMusicList(List<MusicData> FileList){	
System.out.println("SM fresh");
MusicPlayerService.refreshMusicList(FileList);
}



musicplayservice 就是在widget中启动的服务。理想状况应该是,调用startservice的时候,调用MusicPlayService.java中的onCreate()方法,对mMusicPlayer(这是一个静态对象)进行实例化,然后当在widget中调用refreshlist的时候,最终会传递到MusicPlayService.java的refreshMusicList()中,再由更底层的进行调用。
但现在的错误是:每次给我报空指针异常,即:mMusicPlayer没有被实例化,为空,我是不是只能理解为是调用顺序出现了问题?
MusicPlayService.java
	
                public void  onCreate() {
// TODO Auto-generated method stub
Log.v("MusicPlayService", "1");
System.out.println("service creat");
mMusicPlayer = new MusicPlay(this);
mSDStateBrocast = new SDStateBrocast();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(Intent.ACTION_MEDIA_MOUNTED);
intentFilter.addAction(Intent.ACTION_MEDIA_UNMOUNTED);    
intentFilter.addAction(Intent.ACTION_MEDIA_SCANNER_FINISHED); 
intentFilter.addAction(Intent.ACTION_MEDIA_EJECT);    
intentFilter.addDataScheme("file"); 
        registerReceiver(mSDStateBrocast, intentFilter);
super.onCreate();
sendBroadcast(new Intent("com.music.service.create"));
}
               public static void refreshMusicList(List<MusicData> musicFileList) {
// TODO Auto-generated method stub
System.out.println("MPS ffresh  "+musicFileList.size());
//if(mMusicPlayer==null) mMusicPlayer=MusicPlay.getInstance();
mMusicPlayer.refreshMusicList(musicFileList);
System.out.println("wocacao"+musicFileList.size());
}
应用 Web Widget service
补充:移动开发 ,  Android
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,