2011-10-10 133 views
0

這是我的第一篇文章;我是在Android上開發一個新手,我寫了一個REST Web服務接收一個byte []:發送字節[]到REST Web服務的Android客戶端錯誤

@Path("scp") 
public class ScpResources { 

    // ... 

    @POST 
    @Produces("text/plain") 
    @Consumes(MediaType.APPLICATION_OCTET_STREAM)  
    public String upload(byte[] input) { 

     System.out.println("Input: " + new String(input)); 

     return "File Sent!"; 
    }  

} // End 

我測試了此WS與Java獨立的應用程序(Apache的HttpClient的庫),並一切正常,但是,當我嘗試做在Android應用同樣的事情...:

import org.apache.http.client.HttpClient; 
import org.apache.http.client.methods.HttpPost; 
import org.apache.http.entity.ByteArrayEntity; 
import org.apache.http.impl.client.DefaultHttpClient; 

import android.app.Activity; 
import android.os.Bundle; 
import android.util.Log; 

public class MainActivity extends Activity { 

    private static final String TAG = "MainActivity"; 

    @Override /** Called when the activity is first created. */  
    public void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     Log.v(TAG, "--------------> to WS"); 

     try { 
      HttpClient client = new DefaultHttpClient(); 

      String tmp = "abcdefghijklmnopqrstuvwxyz"; 
      byte b[] = tmp.getBytes();    
      HttpPost httpPost = new HttpPost("http://192.168.0.116:8080/WSfEclipse/resources/scp"); 

      ByteArrayEntity entity = new ByteArrayEntity(b); 
      entity.setContentType("application/octet-stream"); 
      httpPost.setEntity(entity); 

      Log.e(TAG, ">Before error"); 
      //if(client == null) Log.e(TAG, "HttpClient null"); 
      //if(httpPost == null) Log.e(TAG, "HttpPost null");    

      client.execute(httpPost); // ERROR    

     } catch (Exception e) { 
      //if(e == null) Log.e(TAG, "Exception(e) null"); 
      Log.e(TAG, e.getMessage()); 
     } 

    } // End : onCreate 

} // End : MainActivity 

...的logcat的打印:

ERROR/MainActivity(368): >Before error 
    AndroidRuntime(368): Shutting down VM 
WARNING/dalvikvm(368):  threadid=1: thread exiting with uncaught exception (group=0x40014760) 
ERROR/AndroidRuntime(368): FATAL EXCEPTION: main 
ERROR/AndroidRuntime(368): java.lang.RuntimeException: Unable to start activity ComponentInfo{..... 
ERROR/AndroidRuntime(368):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1815) 
ERROR/AndroidRuntime(368):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1831) 
ERROR/AndroidRuntime(368):  at android.app.ActivityThread.access$500(ActivityThread.java:122) 
ERROR/AndroidRuntime(368):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1024) 
ERROR/AndroidRuntime(368):  at android.os.Handler.dispatchMessage(Handler.java:99) 
ERROR/AndroidRuntime(368):  at android.os.Looper.loop(Looper.java:132) 
ERROR/AndroidRuntime(368):  at android.app.ActivityThread.main(ActivityThread.java:3948) 
ERROR/AndroidRuntime(368):  at java.lang.reflect.Method.invokeNative(Native Method) 
ERROR/AndroidRuntime(368):  at java.lang.reflect.Method.invoke(Method.java:491) 
ERROR/AndroidRuntime(368):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) 
ERROR/AndroidRuntime(368):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) 
ERROR/AndroidRuntime(368):  at dalvik.system.NativeStart.main(Native Method) 
ERROR/AndroidRuntime(368): Caused by: java.lang.NullPointerException: println needs a message 
ERROR/AndroidRuntime(368):  at android.util.Log.println_native(Native Method) 
ERROR/AndroidRuntime(368):  at android.util.Log.e(Log.java:230) 
ERROR/AndroidRuntime(368):  at MainActivity.onCreate(MainActivity.java:44) 
ERROR/AndroidRuntime(368):  at android.app.Activity.performCreate(Activity.java:4397) 
ERROR/AndroidRuntime(368):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1048) 
ERROR/AndroidRuntime(368):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1779) 
ERROR/AndroidRuntime(368):  ... 11 more 

我的AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
      package="com.edu.radiogis.scpecg.clientecelular.activities" 
      android:versionCode="1" 
      android:versionName="1.0"> 
    <uses-sdk android:minSdkVersion="13" /> 

    <uses-permission android:name="android.permission.INTERNET" /> 

    <application android:icon="@drawable/icon" android:label="ClienteSCP"> 
     <activity android:name=".MainActivity" 
        android:label="ClienteSCP"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 

    </application> 

</manifest> 

當我刪除了catch代碼,沒有錯誤出現;但是,應用程序不會將字節發送到Web服務。我檢查是否有空引用(使用評論中的代碼),但一切都很好。我不知道發生了什麼,也許我忘記了一些事情。

!!提前致謝!

+0

請注意,您不應該在UI線程上執行潛在的長時間運行操作。它會阻止一切,你會得到臭名昭着的應用程序不響應對話框。結帳這看看如何做正確的方式:http://developer.android.com/resources/articles/painless-threading.html –

回答

0

基於異常和缺乏在你的代碼包定義的,我以爲你忘了把你的代碼是清單中列出的包,特別是這樣的:com.edu.radiogis.scpecg.clientecelular.activities

+0

MainActivity.onCreate執行: ... 在MainActivity.onCreate(MainActivity .java:44) ... – aav

+0

我也注意到了,但這一切似乎都很腥...... –

2

什麼你請參閱Log.e方法引發的異常,因爲您傳遞給它的消息文本(e.getMessage)爲null。

您應該檢查從您的http代碼中獲得哪種異常。用e.printStackTrace()替換你的日誌語句。

2

我找到了解決辦法,包是好的(對不起,我沒有表現出包語句),我用e.printStackTrace(),它顯示了Android的NetworkOnMainThreadException,讓我感動的代碼到的AsyncTask:

public class WSConnectionTask extends AsyncTask<Void, String, String> { 

HttpClient client; 
HttpPost httpPost; 
HttpResponse response; 

String tmp = "abcdefghijklmnopqrstuvwxyz"; 
byte[] b; 

@Override 
protected void onPreExecute() { 
    client = new DefaultHttpClient(); 
    b = tmp.getBytes(); 
} // End : onPreExecute 

@Override 
protected String doInBackground(Void... arg0) { 

    httpPost = new HttpPost("http://192.168.0.116:8080/WSfEclipse/resources/scp");  
    ByteArrayEntity entity = new ByteArrayEntity(b); 
    entity.setContentType("application/octet-stream"); 
    httpPost.setEntity(entity); 

    try { 
     client.execute(httpPost); // Send request  
    } 
    catch (Exception e) {   
     e.printStackTrace(); 
    }  
    return "OK"; 

} // End : doInBackground 

} // End : WSConnectionTask 

和!!累積獎金,成功,非常感謝。

+0

接受你的答案,如果沒有其他答案導致你這個解決方案。 Android標籤中有很多開放問題(其中30,000個),請大家幫忙 – Merlin