2012-05-07 4 views
1

서비스와 AsyncTask를 사용하여 약간의 문제가 있습니다. 일부 HTTP 작업을 수행하는 약간의 클래스를 코딩했으며 AsyncTask를 실행하여 백그라운드에서 모든 HTTP 작업을 수행하고 완료되면 응답 데이터로 리스너를 호출합니다.원격 서비스에서 AsyncTask 사용

는 이제 서비스 (원격 서비스) 내부 클래스를 사용할 필요가 있고, 매번 클래스는 로그 고양이에 다음과 같은 메시지와 함께 충돌합니다 AsyncTask를 클래스에서 개체를 만들려고 :

05-07 10:30:01.847: E/JavaBinder(1026): *** Uncaught remote exception! (Exceptions are not yet supported across processes.) 
05-07 10:30:01.847: E/JavaBinder(1026): java.lang.ExceptionInInitializerError 
05-07 10:30:01.847: E/JavaBinder(1026):  at com.lowlevel.umusic.VK.getById(VK.java:46) 
05-07 10:30:01.847: E/JavaBinder(1026):  at com.lowlevel.umusic.Song.requestUri(Song.java:109) 
05-07 10:30:01.847: E/JavaBinder(1026):  at com.lowlevel.umusic.PlayService$1.playSong(PlayService.java:149) 
05-07 10:30:01.847: E/JavaBinder(1026):  at com.lowlevel.umusic.IPlayService$Stub.onTransact(IPlayService.java:55) 
05-07 10:30:01.847: E/JavaBinder(1026):  at android.os.Binder.execTransact(Binder.java:320) 
05-07 10:30:01.847: E/JavaBinder(1026):  at dalvik.system.NativeStart.run(Native Method) 
05-07 10:30:01.847: E/JavaBinder(1026): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 
05-07 10:30:01.847: E/JavaBinder(1026):  at android.os.Handler.<init>(Handler.java:121) 
05-07 10:30:01.847: E/JavaBinder(1026):  at android.os.AsyncTask$InternalHandler.<init>(AsyncTask.java:421) 
05-07 10:30:01.847: E/JavaBinder(1026):  at android.os.AsyncTask$InternalHandler.<init>(AsyncTask.java:421) 
05-07 10:30:01.847: E/JavaBinder(1026):  at android.os.AsyncTask.<clinit>(AsyncTask.java:152) 
05-07 10:30:01.847: E/JavaBinder(1026):  ... 6 more 
05-07 10:30:01.847: W/dalvikvm(1026): threadid=8: thread exiting with uncaught exception (group=0x40015560) 
05-07 10:30:01.847: E/AndroidRuntime(1026): FATAL EXCEPTION: Binder Thread #2 
05-07 10:30:01.847: E/AndroidRuntime(1026): java.lang.ExceptionInInitializerError 
05-07 10:30:01.847: E/AndroidRuntime(1026):  at com.lowlevel.umusic.VK.getById(VK.java:46) 
05-07 10:30:01.847: E/AndroidRuntime(1026):  at com.lowlevel.umusic.Song.requestUri(Song.java:109) 
05-07 10:30:01.847: E/AndroidRuntime(1026):  at com.lowlevel.umusic.PlayService$1.playSong(PlayService.java:149) 
05-07 10:30:01.847: E/AndroidRuntime(1026):  at com.lowlevel.umusic.IPlayService$Stub.onTransact(IPlayService.java:55) 
05-07 10:30:01.847: E/AndroidRuntime(1026):  at android.os.Binder.execTransact(Binder.java:320) 
05-07 10:30:01.847: E/AndroidRuntime(1026):  at dalvik.system.NativeStart.run(Native Method) 
05-07 10:30:01.847: E/AndroidRuntime(1026): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 
05-07 10:30:01.847: E/AndroidRuntime(1026):  at android.os.Handler.<init>(Handler.java:121) 
05-07 10:30:01.847: E/AndroidRuntime(1026):  at android.os.AsyncTask$InternalHandler.<init>(AsyncTask.java:421) 
05-07 10:30:01.847: E/AndroidRuntime(1026):  at android.os.AsyncTask$InternalHandler.<init>(AsyncTask.java:421) 
05-07 10:30:01.847: E/AndroidRuntime(1026):  at android.os.AsyncTask.<clinit>(AsyncTask.java:152) 
05-07 10:30:01.847: E/AndroidRuntime(1026):  ... 6 more 

어떤 아이디어라도 동 기적으로 작동하도록 수업을 수정해야합니까?

감사합니다.

+0

일부 코드를 추가하십시오 .. – Sandeep

+0

코드를 넣을 수는 있지만 필요하지 않습니다. 가장 간단한 AsyncTask, 간단한 원격 서비스 및 AsyncTask의 새 인스턴스를 만드는 서비스 (인터페이스 함수에서)를 상상해보십시오. 그 시점에서 충돌합니다. –

+0

해당 특정 이벤트에서 응용 프로그램을 중단해야하는 많은 이유가있을 수 있으므로 코드가 있으면 쉽게 오류 지점을 얻을 수 있습니다. – Sandeep

답변

1

동일한 문제를 실험하고이 메시지를 찾는 다른 사람들을 도울 수 있기를 바란다.

AsyncTask는 서비스에서 사용할 수 있지만 스텁에서는 사용할 수 없습니다. 저것과 같이 쉬운.

은 스텁에서 호출해야하는 경우 그 작업을 액세스 할 수있는 몇 가지 방법이 있습니다

1 예제 코드 :

public class MyService extends Service { 
    private static final int MSG_CALLTASK = 0; 

    private Handler mHandler = new Handler() { 
     @Override 
     public void handleMessage(Message msg) { 
      switch (msg.what) { 
      case MSG_CALLTASK: 
       new MyAsyncTask().execute(); 
       break; 
      } 
     } 
    }; 

    private IMyService.Stub mStub = new IMyService.Stub = { 
     public void myFunction() { 
      /* Call task */ 
      mHandler.sendMessage(mHandler.obtainMessage(MSG_CALLTASK)); 
     } 
    }; 

    [...] 
} 

2 두 번째 방법은 피하는 것이다 스텁에서 메소드를 호출하고 서비스에 인 텐트를 보내고 'onStartCommand'메소드에서 구문 분석합니다 (인 텐트가 전송 될 때 호출됩니다).

도움이되기를 바랍니다.

0
public class LoginService_Service extends Service { 
    NotificationManager mNM; 
    static String stcode=""; 

    @Override 
    public void onCreate() { 
     mNM = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); 
     new DoLogin().execute(null); 
    } 
    @Override 
    public void onDestroy() { 
     mNM.cancel(R.string.notify_cancel); 
     Log.i("Finish", "OnDestroy Called"); 
    } 

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

    private final IBinder mBinder = new Binder() { 
     @Override 
     protected boolean onTransact(int code, Parcel data, Parcel reply, 
       int flags) throws RemoteException { 
      return super.onTransact(code, data, reply, flags); 
     } 
    }; 
    public class DoLogin extends AsyncTask<Void, Void, Void> { 
     @Override 
     protected Void doInBackground(Void... params) { 
      HttpClient client = new DefaultHttpClient(); 
      HttpConnectionParams 
        .setConnectionTimeout(client.getParams(), 10000); // Timeout 
      try { 
       HttpPost request = new HttpPost(
         "myurl"); 
       JSONStringer jsonstr = new JSONStringer().object().key(
       "UserName").value(prefs.getString("unm", "")).key(
       "Password").value(prefs.getString("pwd", "")) 
       .endObject(); 

       Log.i("JSONStringer", jsonstr.toString()); 
       StringEntity entity = new StringEntity(jsonstr.toString()); 
       entity.setContentType("application/json;charset=UTF-8");// text/plain;charset=UTF-8 
       entity 
         .setContentEncoding(new BasicHeader(
           HTTP.CONTENT_TYPE, 
           "application/json;charset=UTF-8")); 
       request.setEntity(entity); 
       DefaultHttpClient httpClient = new DefaultHttpClient(); 
       HttpResponse res = httpClient.execute(request); 
       Log.i("Request", request.toString()); 
      } catch (Exception e) { 
       e.printStackTrace(); 
       Log.i("Error", "Cannot Estabilish Connection"); 
      } 
      return null; 
     } 
     @Override 
     protected void onPostExecute(Void result) { 
      super.onPostExecute(result); 
      if (stcode != null) { 
       if (stcode.equalsIgnoreCase("0")) { 
        Log.i("ReLogin", "ReLogin Success"); 
       } else { 
        Log.i("ReLogin", "ReLogin Failed"); 
       } 
      } 
      LoginService_Service.this.stopSelf(); 
     } 

    } 
} 
관련 문제