2012-12-21 5 views
2

안녕하세요.바운드 서비스를 호출하면 NullPointerException이 발생합니다.

다음 활동이 있습니다 (아래 코드 참조). 액티비티는 서비스에 제한을 두거나 바인딩하려고 시도합니다.

이 서비스는 숫자를 검색하기 위해 getNumber() 공용 메서드를 노출 (또는 노출해야 함)합니다. 앱에서 NullPointerException이 반환을 중지

mService.getNumber() 

는 실행이 도착합니다.

내가 디버깅했기 때문에 나는 무엇 때문에 mService.getNumber()가 문제를 일으킨다는 것을 이해할 수 있습니다.

편집 : 분명히 서비스가 결합하지 않습니다, 내가

Intent intent = new Intent(this, LocalService.class); 
     bindService(intent, mConnection, Context.BIND_AUTO_CREATE); 

후 mBound 부울을 테스트하고, 따라서 서비스가 문제가 ... 결합하지 않고 false를 돌려줍니다!

package com.example.quotes; 

@TargetApi(3) 
public class LocalService extends Service { 
    public int i; 
    // Binder given to clients 
    private final IBinder mBinder = new LocalBinder(); 
       * Class used for the client Binder. Because we know this service always 
     * runs in the same process as its clients, we don't need to deal with IPC. 
     */ 
    public class LocalBinder extends Binder { 
     LocalService getService() { 
      // Return this instance of LocalService so clients can call public methods 
      return LocalService.this; 
     } 
    } 
    @Override 
    public IBinder onBind(Intent intent) { 
     Log.e("", "sono nel service"); 
     new Task().execute(); 
     return mBinder; 
    } 
     class Task extends AsyncTask<Void, String, Void> { 
     @Override 
     protected Void doInBackground(Void... unused) { 
     for (i=0;;i++) { 
     Log.e("Sono nel AsyncTask del Service", Integer.toBinaryString(i)); 
     SystemClock.sleep(500); 
     } 
     //return(null); 
     } 
    } 

    public int getNumber() { 
     return i; 
    }  
} 

로그 캣 : 어떤 제안

public class Quotes extends Activity { 
    public LocalService mService; 
    boolean mBound = false; 
    @Override 
    public void onCreate(Bundle icicle) { 
     super.onCreate(icicle); 
     setContentView(R.layout.main); 
      // Bind to LocalService 
     Intent intent = new Intent(this, LocalService.class); 
     bindService(intent, mConnection, Context.BIND_AUTO_CREATE); 
     Log.e("", "arrivo a prima di loop"); 
     for(int a=0;;a++){ 
      SystemClock.sleep(500); 
      Log.e("", "sono nel loop"); 
      int num =mService.getNumber(); 
      Toast.makeText(this,Integer.toString(num),  Toast.LENGTH_SHORT).show(); 
       } 
    } 
     private ServiceConnection mConnection = new ServiceConnection() { 
      //@Override 
      public void onServiceConnected(ComponentName className, 
        IBinder service) { 
       Log.e("", "sono in ServiceConnection"); 
    // We've bound to LocalService, cast the IBinder and get LocalService instance 
       LocalBinder binder = (LocalBinder) service; 
       mService = binder.getService(); 
       mBound = true; 
      } 
      //@Override 
      public void onServiceDisconnected(ComponentName arg0) { 
       mBound = false; 
      } 
     }; 

이 서비스의 코드에 대한

감사

12-21 12:05:18.837: D/AndroidRuntime(889): Shutting down VM 
12-21 12:05:18.837: W/dalvikvm(889): threadid=1: thread exiting with uncaught exception  (group=0x40a13300) 
12-21 12:05:18.887: E/AndroidRuntime(889): FATAL EXCEPTION: main 
12-21 12:05:18.887: E/AndroidRuntime(889): java.lang.RuntimeException: Unable to start  activity ComponentInfo{com.example.quotes/com.example.quotes.Quotes}:  java.lang.NullPointerException 
12-21 12:05:18.887: E/AndroidRuntime(889): at  android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059) 
12-21 12:05:18.887: E/AndroidRuntime(889): at  android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084) 
12-21 12:05:18.887: E/AndroidRuntime(889): at  android.app.ActivityThread.access$600(ActivityThread.java:130) 
12-21 12:05:18.887: E/AndroidRuntime(889): at  android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195) 
12-21 12:05:18.887: E/AndroidRuntime(889): at  android.os.Handler.dispatchMessage(Handler.java:99) 
12-21 12:05:18.887: E/AndroidRuntime(889): at android.os.Looper.loop(Looper.java:137) 
12-21 12:05:18.887: E/AndroidRuntime(889): at android.app.ActivityThread.main(ActivityThread.java:4745) 
12-21 12:05:18.887: E/AndroidRuntime(889): at  java.lang.reflect.Method.invokeNative(Native Method) 
12-21 12:05:18.887: E/AndroidRuntime(889): at java.lang.reflect.Method.invoke(Method.java:511) 
12-21 12:05:18.887: E/AndroidRuntime(889): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
12-21 12:05:18.887: E/AndroidRuntime(889): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
12-21 12:05:18.887: E/AndroidRuntime(889): at dalvik.system.NativeStart.main(Native Method) 
12-21 12:05:18.887: E/AndroidRuntime(889): Caused by: java.lang.NullPointerException 
12-21 12:05:18.887: E/AndroidRuntime(889): at com.example.quotes.Quotes.onCreate(Quotes.java:91) 
12-21 12:05:18.887: E/AndroidRuntime(889): at android.app.Activity.performCreate(Activity.java:5008) 
12-21 12:05:18.887: E/AndroidRuntime(889): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079) 
12-21 12:05:18.887: E/AndroidRuntime(889): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023) 
12-21 12:05:18.887: E/AndroidRuntime(889): ... 11 more 
+2

당신은 그것을위한 어떤 오류 – urveshpatel50

+1

를 게시 (INT의 A = 0; ++) – Unknown

+1

사용 의도 의도 = 새로운 의도 (currentClassName, LocalService.class) 할 수 있습니다; – Unknown

답변

4

확인은 수수께끼에 대한 해결책을 foud.

서비스 바인딩은 비동기입니다.

서비스는 onServiceConnected가 호출 될 때만 확실히 바인딩됩니다. 따라서 onServiceConnected에서 서비스에서 수행해야하는 활동을 시작하는 메소드 호출을 추가합니다.

챠오는

관련 문제