2012-05-13 7 views
8

私はこのアンドロイドサービスを稼働させようとしていますが、なぜこのエラーが発生するのかわかりません。Androidサービスandroid.os.BinderProxyエラー

05-13 12:13:36.203: ERROR/dalvikvm(7782): could not disable core file generation for pid 7782: Operation not permitted 
05-13 12:13:36.469: ERROR/AndroidRuntime(7782): FATAL EXCEPTION: main 
05-13 12:13:36.469: ERROR/AndroidRuntime(7782): java.lang.ClassCastException: android.os.BinderProxy 
05-13 12:13:36.469: ERROR/AndroidRuntime(7782):  at whiskeymedia.com.GiantBombAppActivity$1.onServiceConnected(GiantBombAppActivity.java:69) 
05-13 12:13:36.469: ERROR/AndroidRuntime(7782):  at android.app.LoadedApk$ServiceDispatcher.doConnected(LoadedApk.java:1064) 
05-13 12:13:36.469: ERROR/AndroidRuntime(7782):  at android.app.LoadedApk$ServiceDispatcher$RunConnection.run(LoadedApk.java:1081) 
05-13 12:13:36.469: ERROR/AndroidRuntime(7782):  at android.os.Handler.handleCallback(Handler.java:587) 
05-13 12:13:36.469: ERROR/AndroidRuntime(7782):  at android.os.Handler.dispatchMessage(Handler.java:92) 
05-13 12:13:36.469: ERROR/AndroidRuntime(7782):  at android.os.Looper.loop(Looper.java:130) 
05-13 12:13:36.469: ERROR/AndroidRuntime(7782):  at android.app.ActivityThread.main(ActivityThread.java:3806) 
05-13 12:13:36.469: ERROR/AndroidRuntime(7782):  at java.lang.reflect.Method.invokeNative(Native Method) 
05-13 12:13:36.469: ERROR/AndroidRuntime(7782):  at java.lang.reflect.Method.invoke(Method.java:507) 
05-13 12:13:36.469: ERROR/AndroidRuntime(7782):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
05-13 12:13:36.469: ERROR/AndroidRuntime(7782):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
05-13 12:13:36.469: ERROR/AndroidRuntime(7782):  at dalvik.system.NativeStart.main(Native Method) 
05-13 12:13:45.234: ERROR/GlobalUnplugService(7116): plugged = true,mBatteryPlugged=true 

GiantBombAppActivity:

package whiskeymedia.com; 

import java.util.ArrayList; 
import java.util.List; 

import whiskeymedia.com.vo.Achievement; 
import android.app.ListActivity; 
import android.content.ComponentName; 
import android.content.Context; 
import android.content.Intent; 
import android.content.ServiceConnection; 
import android.graphics.Color; 
import android.os.Bundle; 
import android.os.IBinder; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemClickListener; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 
import android.widget.TextView; 
import android.widget.Toast; 

public class GiantBombAppActivity extends ListActivity { 
    private ListView mListView; 

    private AchievementDatabase achievementDatabase; 

    private AchievementUpdateService s; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    mListView = getListView(); 
    List<Achievement> achievements = new ArrayList<Achievement>(); 
    achievementDatabase = new AchievementDatabase(this); 
    achievementDatabase.open(); 
    //achievementDatabase.resetDatabase(); 
    achievements = achievementDatabase.getAllAchievements(); 

    MyAdapter adapter = new MyAdapter(this, achievements); 
    setListAdapter(adapter); 

    List<String> achievementNames = new ArrayList<String>(); 
    for(Achievement achievement: achievements) { 
     achievementNames.add(achievement.getAchievementName()); 

     mListView.setOnItemClickListener(new OnItemClickListener() { 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id){ 
      //When clicked show a toast with the textview text 
      Toast.makeText(getApplicationContext(), ((TextView) view).getText(), Toast.LENGTH_SHORT).show(); 
     } 
     }); 

     doBindService(); 
    } 
    } 

    private ServiceConnection mConnection = new ServiceConnection() { 

    public void onServiceConnected(ComponentName className, IBinder binder) { 
     s = ((AchievementUpdateService.MyBinder) binder).getService(); 
     Toast.makeText(GiantBombAppActivity.this, "Connected", Toast.LENGTH_SHORT).show(); 
    } 

    public void onServiceDisconnected(ComponentName className) { 
     s = null; 
    } 
    }; 

    void doBindService() { 
    bindService(new Intent(this, AchievementUpdateService.class), mConnection, Context.BIND_AUTO_CREATE); 
    } 

    /** 
    * Adapter class to use for the list 
    */ 
    private static class MyAdapter extends ArrayAdapter<Achievement> { 

    /** 
    * Constructor 
    * 
    * @param context The context 
    * @param contacts The list of contacts 
    */ 
    public MyAdapter(final Context context, final List<Achievement> achievements) { 
     super(context, 0, achievements); 
    } 

    @Override 
    public View getView(final int position, final View convertView, final ViewGroup parent) { 
     View view = convertView; 
     if (view == null) { 
     view = LayoutInflater.from(getContext()).inflate(R.layout.list_item, null); 
     } 

     final TextView achiev = (TextView)view.findViewById(R.id.achievement); 
     if (getItem(position).getAchievmentRarity().compareTo("common") == 0) { 
     achiev.setTextColor(Color.GREEN); 
     } 
     else if (getItem(position).getAchievmentRarity().compareTo("uncommon") == 0) { 
     achiev.setTextColor(Color.BLUE); 
     } 
     else if (getItem(position).getAchievmentRarity().compareTo("rare") == 0) { 
     achiev.setTextColor(Color.MAGENTA); 
     } 

     achiev.setText(getItem(position).getAchievementName()); 

     final TextView game = (TextView)view.findViewById(R.id.game); 
     game.setText(getItem(position).getGameName()); 
     return view; 
     } 
    } 
    } 
} 

達成更新サービス:

package whiskeymedia.com; 

import java.io.IOException; 
import java.util.ArrayList; 
import java.util.List; 

import whiskeymedia.com.vo.Achievement; 
import android.app.Service; 
import android.content.Intent; 
import android.os.Binder; 
import android.os.IBinder; 

public class AchievementUpdateService extends Service{ 

    private AchievementDatabase achievementDatabase; 

    private final IBinder mBinder = new MyBinder(); 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
    HtmlParser htmlParser = new HtmlParser(); 
    try { 
     List<Achievement> achievements= htmlParser.parseDocument(); 
     achievementDatabase.loadAchievements(achievements); 
    } catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
    } 

    return Service.START_NOT_STICKY; 
    } 

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

    public class MyBinder extends Binder { 
    AchievementUpdateService getService() { 
    return AchievementUpdateService.this; 
    } 
    } 

} 

私が間違っているの何任意のアイデア?

答えて

34

戻ってくるバインダーがローカルバインダークラスではなく、BinderProxyのインスタンスであるためクラッシュしています。これは、通常、アクティビティが同じプロセスにないサービスにバインドしようとしているために発生します。プロセスの境界をまたいでバインドする場合、実際のインスタンスの代わりにBinderProxyのインスタンスが使用されます(これは別のプロセスにあるためです)。

AndroidManifest.xmlの外観は?

+0

私は今仕事中ですが、あなたが正しいと思います。私はそれがそれ自身のプロセスだと信じています。 – Landister

+1

この場合、a)同じプロセスに戻すか、またはb)ローカルバインダの代わりにAIDLバインダを書き込む必要があります。 –

+0

助けてくれてありがとう – Landister