2012-05-13 34 views
8

Tôi đã cố gắng để có được dịch vụ android này làm việc nhưng tôi không thể tìm ra lý do tại sao tôi nhận được lỗi này.Dịch vụ Android android.os.BinderProxy lỗi

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; 
     } 
    } 
    } 
} 

Achievement cập nhật dịch vụ:

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; 
    } 
    } 

} 

Bất kỳ ý tưởng những gì tôi đang làm sai?

Trả lời

34

Sự cố là do chất kết dính bạn đang lấy lại là một phiên bản của BinderProxy, không phải là lớp binder địa phương của bạn. Điều này thường xảy ra vì hoạt động của bạn đang cố gắng liên kết với một dịch vụ không có trong cùng một quy trình. Khi ràng buộc giữa các ranh giới quá trình, một thể hiện của BinderProxy được sử dụng thay cho cá thể thực tế (vì nó nằm trong một tiến trình khác).

AndroidManifest.xml của bạn trông như thế nào?

+0

Ooooh, tôi đang làm việc ngay bây giờ nhưng tôi nghĩ bạn đúng. Tôi tin rằng tôi đã cho nó một quá trình riêng. – Landister

+1

Nếu trường hợp đó xảy ra, bạn cần phải a) chuyển nó trở lại quá trình tương tự, hoặc b) viết một chất kết dính AIDL thay vì một chất kết dính cục bộ. –

+0

Cảm ơn sự giúp đỡ – Landister

Các vấn đề liên quan