Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 绑定到启动的服务后,从未调用ServiceConnection.onServiceConnected()_Android_Multithreading_Android Service_Android Tabhost_Android Progressbar - Fatal编程技术网

Android 绑定到启动的服务后,从未调用ServiceConnection.onServiceConnected()

Android 绑定到启动的服务后,从未调用ServiceConnection.onServiceConnected(),android,multithreading,android-service,android-tabhost,android-progressbar,Android,Multithreading,Android Service,Android Tabhost,Android Progressbar,在游戏应用程序中,我有以下场景: 从主游戏活动,玩家开始在后台运行的几个游戏任务,持续时间各不相同 玩家应该能够在单独的视图中查看正在运行的游戏任务的进度 为此,我创建了两个活动和一个服务,定义如下: Service ProgressService处理在并行线程上同时运行的多个ProgressBars Activity WorkScreen2创建游戏任务,使用startService()启动服务,并在包中传递任务参数 Activity ProgressScreen绑定到服务以获取并显示正

在游戏应用程序中,我有以下场景:

  • 从主游戏
    活动
    ,玩家开始在后台运行的几个游戏任务,持续时间各不相同
  • 玩家应该能够在单独的
    视图中查看正在运行的游戏任务的进度

为此,我创建了两个
活动
和一个
服务
,定义如下:

  • Service ProgressService
    处理在并行线程上同时运行的多个
    ProgressBar
    s

  • Activity WorkScreen2
    创建游戏任务,使用
    startService()
    启动
    服务,并在
    包中传递任务参数

  • Activity ProgressScreen
    绑定到
    服务
    以获取并显示正在运行的任务的
    ProgressBar
    s

  • 两个活动都在一个
    TabActivity
    的单独
    TabHost
    s下运行


我遇到的问题是,
ServiceConnection.onServiceConnected()
方法从未被调用。我得到了一个
Java.lang.NullPointerException
,因为我试图调用
服务
对象的一个方法,该方法应该在这个方法中分配。请参阅下面的代码

我使用
getApplicationContext().bindService()
活动
绑定到
服务
。此方法返回
true
。因此,绑定是成功的


这是
服务

公共类ProgressService扩展服务实现游戏常量{
公共静态最终字符串广播\u PROGRESS=“com.mycompany.android.mygame.progressbroadcast”;
私有静态最终长更新间隔=500;
私人伊宾德;
私有列表mProgressBarList;
私有列表mStaffNameList;
私有最终类ServiceHandler扩展处理程序{
公共服务处理程序(活套-活套){
超级(活套);
}
@凌驾
公共无效handleMessage(消息消息消息){
ProgressBar ProgressBar=新的ProgressBar(ProgressService.this);
mProgressBarList.add(progressBar);
Bundle=msg.getData();
String staffName=bundle.getString(WorkScreen2.STAFF\u NAME);
mStaffNameList.add(staffName);
int taskDurationMillis=bundle.getInt(WorkScreen2.TASK_DURATION)*1000;
progressBar.setMax(taskDurationMillis/1000);
long startTimeMillis=SystemClock.uptimemilis();
long elapsedTimeMillis=SystemClock.uptimeMillis()
-斯塔蒂梅米利斯;
意图=新意图();
意图.设置动作(广播进度);
而(elapsedTimeMillisintent
*/ @凌驾 公共int onStartCommand(Intent Intent、int标志、int startId){ Toast.makeText(这是“开始服务”,Toast.LENGTH_LONG).show(); HandlerThread线程=新的HandlerThread(“ServiceStarTargetments”, 进程。线程(优先级(后台); thread.start(); Handler serviceHandler=新的serviceHandler(thread.getLooper()); Message msg=serviceHandler.obtainMessage(); msg.arg1=startId; msg.setData(intent.getExtras()); sendMessage(msg); 返回开始时间; } @凌驾 公共IBinder onBind(意向){ 返回mBinder; } 公共类ProgressServiceBinder扩展了Binder{ ProgressService getService(){ 返回ProgressService.this; } } 公共列表getProgressBarList(){ 返回mProgressBarList; } 公共列表getStaffNameList(){ 返回mStaffNameList; } @凌驾 公共空间{ Toast.makeText(这是“服务完成”,Toast.LENGTH_SHORT).show(); } } 这是绑定到它的
活动

public class ProgressScreen扩展了ListActivity{
私有最终字符串标记=“ProgressScreen”;
私人住宅;
私人进度服务;
私有列表mProgressBarList;
私有列表mStaffNameList;
@凌驾
创建公共void(Bundle){
Log.i(标记“ProgressScreen oncreate”);
super.onCreate(bundle);
setContentView(R.layout.progress\u screen\u布局);
IntentFilter=newintentfilter();
filter.addAction(ProgressService.BROADCAST\u PROGRESS);
寄存器接收器(接收器、过滤器);
doBindService();
mAdapter=新的ProgressScreenAdapter(此,mStaffNameLis
<service
    android:name=".ProgressService"
    android:label="@string/progress_service">
</service>
mProgressBarList = mProgressService.getProgressBarList();
mStaffNameList = mProgressService.getStaffNameList();
private final IBinder mBinder = new ServiceBinder();

 public class ServiceBinder extends Binder {
   public PlayerActivity getService() {
   return PlayerActivity.this;
     }
  }

@Nullable
@Override
           public IBinder onBind(Intent intent) {
             return mBinder;
           }