2 Stimmen

Android: Kann keine http-Post senden

Ich habe mir den Kopf zerbrochen, um herauszufinden, wie man eine Postmethode in Android sendet. Dies ist, wie mein Code aussehen:

public class HomeActivity extends Activity implements OnClickListener {

    private TextView textView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        textView = (TextView) findViewById(R.id.text);
        Button button = (Button)findViewById(R.id.button);
        button.setOnClickListener(this);

    }

    @Override
    public void onClick(View view) {    
        HttpPost httpMethod = new HttpPost("http://www.example.com/");
        httpMethod.addHeader("Accept", "text/html");
        httpMethod.addHeader("Content-Type", "application/xml");

        AndroidHttpClient client = AndroidHttpClient.newInstance("Android");
        String result = null;
        try {
            HttpResponse response = client.execute(httpMethod);
            textView.setText(response.toString());

            HttpEntity entity = response.getEntity();

            Log.i(HomeActivity.class.toString(), result);
            textView.setText("Invoked webservice");
        } catch (IOException e) {
            e.printStackTrace();
            Log.e(HomeActivity.class.toString(), e.getMessage());
            textView.setText("Something wrong:" + e.getMessage());
        }
    }
}

Dies ist die Ausnahme, die ich bekomme:

I/ARMAssembler(   59): generated scanline__00000177:03515104_00001001_00000000 [
 91 ipp] (114 ins) at [0x334348:0x334510] in 1430659 ns
W/System.err(  272): java.net.UnknownHostException: www.example.com
W/System.err(  272):    at java.net.InetAddress.lookupHostByName(InetAddress.jav
a:513)
W/System.err(  272):    at java.net.InetAddress.getAllByNameImpl(InetAddress.jav
a:278)
W/System.err(  272):    at java.net.InetAddress.getAllByName(InetAddress.java:24
2)
W/System.err(  272):    at org.apache.http.impl.conn.DefaultClientConnectionOper
ator.openConnection(DefaultClientConnectionOperator.java:136)
W/System.err(  272):    at org.apache.http.impl.conn.AbstractPoolEntry.open(Abst
ractPoolEntry.java:164)
W/System.err(  272):    at org.apache.http.impl.conn.AbstractPooledConnAdapter.o
pen(AbstractPooledConnAdapter.java:119)
W/System.err(  272):    at org.apache.http.impl.client.DefaultRequestDirector.ex
ecute(DefaultRequestDirector.java:348)
W/System.err(  272):    at org.apache.http.impl.client.AbstractHttpClient.execut
e(AbstractHttpClient.java:555)
W/System.err(  272):    at org.apache.http.impl.client.AbstractHttpClient.execut
e(AbstractHttpClient.java:487)
W/System.err(  272):    at org.apache.http.impl.client.AbstractHttpClient.execut
e(AbstractHttpClient.java:465)
W/System.err(  272):    at android.net.http.AndroidHttpClient.execute(AndroidHtt
pClient.java:243)
W/System.err(  272):    at com.collaboapp.android.HomeActivity.onClick(HomeActiv
ity.java:152)
W/System.err(  272):    at android.view.View.performClick(View.java:2408)
W/System.err(  272):    at android.view.View$PerformClick.run(View.java:8816)
W/System.err(  272):    at android.os.Handler.handleCallback(Handler.java:587)
W/System.err(  272):    at android.os.Handler.dispatchMessage(Handler.java:92)
W/System.err(  272):    at android.os.Looper.loop(Looper.java:123)
W/System.err(  272):    at android.app.ActivityThread.main(ActivityThread.java:4
627)
W/System.err(  272):    at java.lang.reflect.Method.invokeNative(Native Method)
W/System.err(  272):    at java.lang.reflect.Method.invoke(Method.java:521)
W/System.err(  272):    at com.android.internal.os.ZygoteInit$MethodAndArgsCalle
r.run(ZygoteInit.java:868)
W/System.err(  272):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.ja
va:626)
W/System.err(  272):    at dalvik.system.NativeStart.main(Native Method)
E/class android.HomeActivity(  272): www.example.com
D/ThrottleService(   59): finally have imsi - retreiving data
D/ThrottleService(   59): onPollAlarm - roaming =false, read =0, written =0, new
 total =0
D/SntpClient(   59): request time failed: java.net.SocketException: Address fami
ly not supported by protocol

Was mache ich hier falsch? Gibt es irgendetwas, das ich im Android-Emulator konfigurieren muss, damit das funktioniert?

Ich danke Ihnen für Ihre Hilfe.

0 Stimmen

Welchen Fehler / welche Ausnahme sehen Sie?

0 Stimmen

Woher wissen Sie dann, dass es nicht funktioniert? Können Sie sich die Zugriffsprotokolle auf der Serverseite ansehen und keinen Eintrag sehen oder einen Proxy dazwischenschalten, der keine Anfragen erhält?

0 Stimmen

@ZeissS. Okay, jetzt habe ich herausgefunden, wie ich das Protokoll bekomme.

7voto

user365659 Punkte 96

Es scheint, dass AndroidHttpClient für diese Ausnahme verantwortlich ist. Ihr Beispiel wird funktionieren

  • wenn Sie die 'INTERNET'-Übertragung wie vorgeschlagen einstellen
  • AndroidHttpClient" durch "DefaultHttpClient" ersetzen
  • die Zeile "Log.i(HomeActivity.class.toString(), result);" entfernen, da das Ergebnis null ist

Es ist mir nicht klar, warum diese Klasse nicht wie erwartet funktioniert, vielleicht kann das jemand erklären. Dieser Thread diskutiert das Problem auch, aber es gibt auch keine Erklärung, warum der Code fehlschlägt: http://groups.google.de/group/Android-developers/browse_thread/thread/cc59efb9475ac557/81116369f2c6bd7a?hl=de&lnk=gst&q=This+Thread+Gebote+HTTP+Anfragen#81116369f2c6bd7a .

0 Stimmen

Dies geschieht, weil HTTP-Anforderungen den UI-Thread aufhalten könnten. AndroidHttpClient sollte nur auf einem Hintergrund-Thread ausgeführt werden (z. B. in einer AsyncTask). Android-developers.blogspot.co.uk/2010/07/ "AndroidHttpClient lässt nicht zu, dass er vom Hauptthread gestartet wird.

6voto

Infiniti Fizz Punkte 1706

Sie können das Web nicht vom UI-Thread aus aufrufen, damit Sie die Benutzeroberfläche der App nicht anhalten. Dieser Blogbeitrag erklärt dies anhand einer Beispiel-App mit AndroidHttpClient: Offizieller Android-Entwicklungsblog .

Hier ist ein Zitat:

...dies ist eine so schlechte Idee, dass der AndroidHttpClient nicht zulässt, dass er vom Hauptthread gestartet wird. Der obige Code zeigt stattdessen die Fehlermeldung "Dieser Thread verbietet HTTP-Anfragen" an. Verwenden Sie stattdessen den DefaultHttpClient, wenn Sie sich wirklich in den Fuß schießen wollen.

Also, wenn Sie wirklich wollen, führen Sie diese auf UI-Thread (schlechte Idee, aus persönlicher Erfahrung und dass Blog-Post) dann DefaultHttpClient verwenden.

0voto

qrtt1 Punkte 7498

Haben Sie uses-permission in der AndroidManifest.xml?

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

0 Stimmen

W/dalvikvm( 261): threadid=1: Thread wird mit einer nicht erfassten Ausnahme beendet (group=0x4 001d800) E/AndroidRuntime( 261): FATAL EXCEPTION: main E/AndroidRuntime( 261): java.lang.RuntimeException: Dieser Thread verbietet HTTP-Requests

0voto

oueslatibilel Punkte 567

Vielen Dank, ich habe este Ich hatte gerade den StrictMode aktiviert.

 public void onCreate() {
 if (DEVELOPER_MODE) {
     StrictMode.enableDefaults();
 }
 super.onCreate();

}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X