Logcat zeigt "Herunterfahren der VM"
Ich versuche zu einem server herstellen und drucken Sie die Antworten.
Seltsame Sache ist, dass wenn ich auf den button in meiner Tätigkeit, startet die Verbindung,
es zwingen, sofort geschlossen.
Nach einem Blick in logcat
, was ich sehe, ist, dass die VM heruntergefahren wird.
Ich sehe, dass es scheint, zu sein jemand sah, dass ein ähnliches problem wie ich:
Die logcat in android zeigt einfach Herunterfahren der VM?
Leider glaube ich nicht, das problem war eigentlich beantwortet, und es wirklich verwirrt mich.
Stack trace:
03-06 20:12:47.012: I/System.out(2757): I'm in main
03-06 20:12:48.092: D/gralloc_goldfish(2757): Emulator without GPU emulation detected.
03-06 20:13:03.462: I/System.out(2757): I'm at quote viewer
03-06 20:13:04.291: I/Choreographer(2757): Skipped 32 frames! The application may be doing too much work on its main thread.
03-06 20:13:09.881: D/AndroidRuntime(2757): Shutting down VM
03-06 20:13:09.881: W/dalvikvm(2757): threadid=1: thread exiting with uncaught exception (group=0x40a70930)
03-06 20:13:09.901: D/dalvikvm(2757): GC_CONCURRENT freed 130K, 9% free 2652K/2888K, paused 80ms+5ms, total 222ms
03-06 20:13:09.941: E/AndroidRuntime(2757): FATAL EXCEPTION: main
03-06 20:13:09.941: E/AndroidRuntime(2757): java.lang.IllegalStateException: Could not execute method of the activity
Zeile 3 ("ich bin bei der quote viewer") ist der Teil, wo ich bin in der QuoteViewerActivity wo ich einen button, der eine Verbindung zum server herstellt, wenn Sie gedrückt werden.
Code für die QuoteViewerActivity unten:
package com.pheno.networkprogrammingiphenoexercise;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import java.io.BufferedReader;
import java.io.IOException;
import java.net.Socket;
import java.net.UnknownHostException;
public class QuoteViewerActivity extends Activity {
private String mHost = "ota.iambic.com";
private int mPort = 17;
private TextView mQuote1, mQuote2, mQuote3;
@Override
public void onCreate(Bundle savedInstanceState) {
System.out.println("I'm at quote viewer");
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_quote_viewer);
mQuote1 = (TextView)findViewById(R.id.quote1);
mQuote2 = (TextView)findViewById(R.id.quote2);
mQuote3 = (TextView)findViewById(R.id.quote3);
}
public void showQuotes(View clickedButton) {
try {
TextView[] quoteArray = {mQuote1, mQuote2, mQuote3};
for(int i = 0; i < 3; i++) {
Socket socket = new Socket(mHost, mPort);
System.out.println("Get Socket");
BufferedReader in = SocketUtils.getReader(socket);
String quoteResult = in.readLine();
System.out.println(quoteResult);
quoteArray[i].setText(quoteResult);
socket.close();
}
} catch(UnknownHostException uhe) {
mQuote1.setText("Unknown host: " + mHost);
//uhe.printStackTrace();
Log.e("pheno", "What happened", uhe);
} catch(IOException ioe) {
mQuote1.setText("IOException: " + ioe);
Log.e("pheno", "What happened", ioe);
}
}
}
Jede Hilfe oder Anregungen wäre sehr geschätzt werden! Danke!
Das ist, was passiert wenn die app abstürzt. Betrachten Sie die Linien nach, um zu sehen, welche code-Zeile verursacht den Fehler.
Vielen Dank für die Anregungen, ich werde das hinzufügen von mehr meldet, und tatsächlich tun zu haben scheinen, lokalisiert das problem durch die zusätzlichen Protokolle(die zu sein scheint, was Alex redet weiter unten!)
Auch ein Blick auf den code, wo Sie den action-listener auf die Schaltfläche, und von wo showQuotes-Methode aufgerufen wird? das wird helfen, das problem zu diagnostizieren.
InformationsquelleAutor Pheno Huang | 2013-03-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kann ich nicht sicher sein, warum der emulator zeigt dies genaue Fehler, aber ich weiß für eine Tatsache, dass das, was Sie tun, ist verpönt stark in der pre-4.0-Geräte (und Emulatoren) und in der Regel verboten 4.0+ Geräte. Das heißt, Sie sollten grundsätzlich jedem Netzwerk-Aufrufe in einem separaten thread. Der richtige Weg, dies zu tun ist mit einem AsyncTask.
Diese Objekte sind ziemlich hässlich, sondern sind auch der beste Weg, um sicherzustellen, dass Sie nicht binden der UI-thread. Der UI-thread ist der thread, auf dem Sie Ihre
showQuotes
Methode ist, die gerade läuft, und Android erwartet, dass mit diesem thread zu tun, nur kurze Sachen. Wenn es beginnt, um die Warteschlange zu viele Ereignisse, Android 4.0+ Absturz der app. Ich denke, pre-4.0 es wird einfach nur angezeigt zu werden, werden eingefroren (im wesentlichen genau das, was Sie wollen, es zu tun, ich Schätze), aber ich würde nicht darauf zählen.So, mit einem AsyncTask, würden Sie schreiben es so auf:
Nervt es, dass Sie zu tun haben, Dinge wie diese, seit es counter-intuitive, im Vergleich zum schreiben einer Desktop-Anwendung, aber das Problem ist, dass Android hat, führen Sie mehrere apps gleichzeitig und schnell in der Lage, aussetzen Ihren Antrag in jedem moment, wenn eine andere app kommt in den Vordergrund (auf diese Weise können Android 'multitask', ohne die Batterie entleeren), das ist, warum Ihr UI-thread hat immer mehr oder weniger zur Verfügung für eingehende Ereignisse.
Yep, kein problem. Ich habe festgestellt, das in meiner app, wenn 4.1 kam gerade heraus. Ich denke, Android 4.0 und höher) speziell prüft, um zu sehen, wenn Sie machen, Netzwerk fordert den Haupt-thread und löst eine Ausnahme aus. Es ist immer noch seltsam, obwohl, da bist du nicht empfangen, die Ausnahme. Ihre logcat Fehler scheint zu sagen, dass es einfach nur 'warten zu lange". Vielleicht ist das nur der emulator, anders als bei einem realen Gerät. Naja, hoffe, es funktioniert für Sie der AsyncTask Weg obwohl.
InformationsquelleAutor Alex