2012-05-07 51 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

plz添加一些代碼.. – Sandeep

+0

我可以把一些代碼,但我不認爲這是必要的。試想一下最簡單的AsyncTask,一個簡單的遠程服務,以及試圖創建AsyncTask的新實例的服務(在接口函數中)。它在那一刻崩潰了。 –

+0

可能有很多原因導致應用程序在特定事件中崩潰,所以如果我們有代碼,那麼很容易就可以得到故障點。 – Sandeep

回答

1

我回答我自己的問題,希望它可以幫助其他人嘗試相同的問題,並找到此消息。

AsyncTask可以在服務中使用,但不能在存根中使用。就如此容易。

有幾種方法,讓他們的工作,如果你需要從存根給他們打電話:

示例代碼:

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

    } 
}