這是我的第一篇文章;我是在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服務。我檢查是否有空引用(使用評論中的代碼),但一切都很好。我不知道發生了什麼,也許我忘記了一些事情。
!!提前致謝!
請注意,您不應該在UI線程上執行潛在的長時間運行操作。它會阻止一切,你會得到臭名昭着的應用程序不響應對話框。結帳這看看如何做正確的方式:http://developer.android.com/resources/articles/painless-threading.html –