每次声明和运行两个服务时,我都会遇到以下 binder.proxy 异常。一项服务在不同的进程(对应用程序私有(private))中运行,而另一项服务在与我的应用程序在(默认应用程序进程)中运行的相同进程中运行,并带有 Binder 实现。
AndroidManifest.xml:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.service.check"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="21" />
<application
android:name="com.service.check.MainApplication"
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service
android:name="com.service.check.SecondService"
android:exported="false"/>
<service
android:name="com.service.check.FirstService"
android:process=":newProcess" >
</service>
</application>
</manifest>
我在单击按钮时在 MainActivity 中启动我的第一个服务:
MainActivity.java
public class MainActivity extends ActionBarActivity implements OnClickListener {
private Button mLanchServiceBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mLanchServiceBtn=(Button) findViewById(R.id.launch_btn);
mLanchServiceBtn.setOnClickListener(this);
}
@Override
public void onClick(View v) {
//Starting first service
Intent launch=new Intent(this,FirstService.class);
startService(launch);
}
}
MainApplication 类中的第二个服务为。
MainApplication.java
public class MainApplication extends Application {
private SecondService.LocalBinder mBinder;
private ServiceConnection mConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName className, IBinder service) {
mBinder = (LocalBinder) service;
}
@Override
public void onServiceDisconnected(ComponentName arg0) {
}
};
@Override
public void onCreate() {
super.onCreate();
//starting second service
Intent launch=new Intent(this,SecondService.class);
startService(launch);
//Binding to it
bindService(launch, mConnection, BIND_AUTO_CREATE);
}
}
FirstService.java
public class FirstService extends Service {
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
SecondService.java
public class SecondService extends Service{
//Service Containing Local Binder
private LocalBinder mBinder=new LocalBinder();
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
class LocalBinder extends Binder{
public LocalBinder() {
}
}
}
堆栈跟踪:
02-05 10:32:25.035: E/AndroidRuntime(1424): Process:
com.service.check:newProcess, PID: 1424 02-05 10:32:25.035:
E/AndroidRuntime(1424): java.lang.ClassCastException:
android.os.BinderProxy cannot be cast to
com.service.check.SecondService$LocalBinder 02-05 10:32:25.035:
E/AndroidRuntime(1424): at
com.service.check.MainApplication$1.onServiceConnected(MainApplication.java:23)
02-05 10:32:25.035: E/AndroidRuntime(1424): at
android.app.LoadedApk$ServiceDispatcher.doConnected(LoadedApk.java:1101)
我已引用以下链接来解决问题,其中说: 如果我的 Activity 和服务在不同的进程中,那么我们不应该像我那样绑定(bind)。
Android service android.os.BinderProxy error
java.lang.ClassCastException: android.os.BinderProxy cannot be cast to LocalBinder
但就我而言: 我从 MainApplication 绑定(bind)到 SecondService 并且两者都在同一个进程(即默认应用程序进程)中运行。我仍然在 SecondService 中面临 binderProxy 异常,而我的 FirstService 在我什至没有绑定(bind)的单独进程中运行。
请帮助我解决这种情况,并建议我最好的方法,以便我可以在不发生任何崩溃的情况下实现相同的场景。
最佳答案
遇到这个问题(本地服务返回 BinderProxy),想发布我在尝试调试时找到此页面后的发现。简短版本作为句子的运行:启动远程服务会在新进程中创建 Application 类的第二个实例,然后尝试绑定(bind)到由原始 Application 实例启动的本地服务,就好像它是本地服务一样,但是由于该服务在原始进程中运行,因此它跨进程绑定(bind),您将获得 BinderProxy 而不是预期的 Binder 类。
关于 Android 服务,有几点需要牢记。每个服务都有一个分配的进程,它将在其中运行。如果您没有在 Android Manifest 中分配进程,它将在默认进程(运行应用程序、 Activity 等的进程)中运行。不提供进程名称并不意味着它将在您绑定(bind)到/启动服务的同一进程中运行该服务。
假设我有一个 MyApplication 类,它试图在启动时绑定(bind)到两个服务:一个在默认进程中运行的服务(我们称之为 LocalService),一个在单独的进程(RemoteService)中运行。
用户启动我的应用程序,它在默认进程中创建一个 MyApplication 实例。然后此实例尝试绑定(bind)到 LocalService。 Android在默认进程中创建LocalService,并将LocalService的Binder类返回给app(mBinder = (LocalBinder) service;)。很好,我们已经成功绑定(bind)到 LocalService。
接下来,该应用会尝试绑定(bind)到 RemoteService。 Android 使用您在 Android list 中提供的名称创建一个新进程。但是,在它可以创建 RemoteService 之前,它需要为该服务创建一个应用程序以在其中运行。它在远程进程中创建一个新的 MyApplication 实例并启动它。
但是,在单独进程中运行的新 MyApplication 实例会在启动期间尝试绑定(bind)到 LocalService。因为 LocalService 在默认进程中运行,所以这是一个跨进程绑定(bind),但 MyApplication 期望这是一个进程内绑定(bind)。 Android 返回 BinderProxy,第二个 MyApplication 实例试图将其转换为 LocalBinder 并崩溃。有趣的是,它会在不同的进程中崩溃,因此您的应用程序和 Activity 实际上可以继续运行。您将永远无法绑定(bind)到远程服务。
如果您想使用应用程序上下文绑定(bind)到本地服务并同时使用远程服务,您需要处理以下事实:Android 将在启动远程服务时在远程进程中创建另一个应用程序。我懒得尝试这个(我只是将我的远程服务设为本地服务),但您可以在应用程序创建期间检查进程名称,如果它不是默认进程则不绑定(bind)。
关于java - 每次我声明并运行两个服务时获取 java.lang.ClassCastException : android. os.BinderProxy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28364724/
我正在尝试使用ruby和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我
我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..
exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby中使用两个参数异步运行exe吗?我已经尝试过ruby命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何rubygems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除
我正在使用active_admin,我在Rails3应用程序的应用程序中有一个目录管理,其中包含模型和页面的声明。时不时地我也有一个类,当那个类有一个常量时,就像这样:classFooBAR="bar"end然后,我在每个必须在我的Rails应用程序中重新加载一些代码的请求中收到此警告:/Users/pupeno/helloworld/app/admin/billing.rb:12:warning:alreadyinitializedconstantBAR知道发生了什么以及如何避免这些警告吗? 最佳答案 在纯Ruby中:classA
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
最近,当我启动我的Rails服务器时,我收到了一长串警告。虽然它不影响我的应用程序,但我想知道如何解决这些警告。我的估计是imagemagick以某种方式被调用了两次?当我在警告前后检查我的git日志时。我想知道如何解决这个问题。-bcrypt-ruby(3.1.2)-better_errors(1.0.1)+bcrypt(3.1.7)+bcrypt-ruby(3.1.5)-bcrypt(>=3.1.3)+better_errors(1.1.0)bcrypt和imagemagick有关系吗?/Users/rbchris/.rbenv/versions/2.0.0-p247/lib/ru
在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo
我是Google云的新手,我正在尝试对其进行首次部署。我的第一个部署是RubyonRails项目。我基本上是在关注thisguideinthegoogleclouddocumentation.唯一的区别是我使用的是我自己的项目,而不是他们提供的“helloworld”项目。这是我的app.yaml文件runtime:customvm:trueentrypoint:bundleexecrackup-p8080-Eproductionconfig.ruresources:cpu:0.5memory_gb:1.3disk_size_gb:10当我转到我的项目目录并运行gcloudprevie
我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b
我正在阅读一本关于Ruby的书,作者在编写类初始化定义时使用的形式与他在本书前几节中使用的形式略有不同。它看起来像这样:classTicketattr_accessor:venue,:datedefinitialize(venue,date)self.venue=venueself.date=dateendend在本书的前几节中,它的定义如下:classTicketattr_accessor:venue,:datedefinitialize(venue,date)@venue=venue@date=dateendend在第一个示例中使用setter方法与在第二个示例中使用实例变量之间是