Ошибка в клиенте Android, который отправляет байт [] в веб-службу REST - PullRequest
0 голосов
/ 10 октября 2011

это мой первый пост; Я новичок в разработке Android, я написал REST-веб-сервис для получения байта []:

@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>

Когда я удалил код перехвата, никаких ошибок не появляется; тем не менее, приложение не отправляет байты в веб-сервис. Я проверил, были ли нулевые ссылки (используя код в комментариях), но все было в порядке. Я не знаю, что происходит, может быть, я что-то забыл.

!! Спасибо заранее !!

Ответы [ 3 ]

2 голосов
/ 10 октября 2011

То, что вы видите, является исключением, вызванным методом Log.e, потому что текст сообщения, которое вы передаете ему (e.getMessage), имеет значение null.

Вы должны проверить, какое исключение вы получаете из своего httpкод.Замените оператор ведения журнала на e.printStackTrace ().

2 голосов
/ 10 октября 2011

Я нашел решение, пакет был в порядке (извините, я не показывал оператор пакета), я использовал 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 голосов
/ 10 октября 2011

Исходя из исключения и отсутствия определения пакета в вашем коде, я думаю, что вы забыли поместить свой код в пакет, который указан в Манифесте, а именно: com.edu.radiogis.scpecg.clientecelular.activities

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...