2011-01-18 13 views
30

Sono stato colpito a causa di IllegalStateException nel seguente codice. Qualcuno può aiutarmi? Codice: messaggioIllegalStateException: il contenuto è stato consumato

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.security.MessageDigest; 
import java.security.NoSuchAlgorithmException; 
import java.util.ArrayList; 
import java.util.List; 

import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.NameValuePair; 
import org.apache.http.ParseException; 
import org.apache.http.client.ClientProtocolException; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.entity.UrlEncodedFormEntity; 
import org.apache.http.client.methods.HttpPost; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.apache.http.message.BasicNameValuePair; 
import org.apache.http.protocol.HTTP; 
import org.apache.http.util.EntityUtils; 
import org.json.JSONObject; 

import android.app.Activity; 
import android.os.Bundle; 
import android.telephony.gsm.GsmCellLocation; 
import android.util.Log; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.EditText; 
import android.widget.Toast; 

public class Login extends Activity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.login); 
     Button bt = (Button) findViewById(R.id.logbt); 
     final EditText user = (EditText) findViewById(R.id.loguser); 
     final EditText pw = (EditText) findViewById(R.id.logpw); 
     bt.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if (user.getText().toString() != "" && pw.getText().toString() != "") { 
        Thread t = new Thread() { 
         public void run() { 
          try { 
           HttpClient client = new DefaultHttpClient(); 
           String postURL = "http://surfkid.redio.de/login"; 
           HttpPost post = new HttpPost(postURL); 
           ArrayList<NameValuePair> params = new ArrayList<NameValuePair>(); 
           params.add(new BasicNameValuePair("username", user.getText().toString())); 
           params.add(new BasicNameValuePair("password", md5(pw.getText().toString()))); 
           UrlEncodedFormEntity ent = new UrlEncodedFormEntity(params, HTTP.UTF_8); 
           post.setEntity(ent); 
           HttpResponse responsePOST = client.execute(post); 
           HttpEntity resEntity = responsePOST.getEntity(); 
           final JSONObject jObject = new JSONObject(EntityUtils.toString(resEntity)); 
           Log.e("XXX", EntityUtils.toString(resEntity)); 
          } catch (Exception e) { 
           Log.e("XXX", e.toString()); 
          } 
         } 
        }; 
        t.start(); 
        // Log.e("XXX",s); 
       } 
      } 
     }); 
    } 

    private String md5(String in) { 
     MessageDigest digest; 
     try { 
      digest = MessageDigest.getInstance("MD5"); 
      digest.reset(); 
      digest.update(in.getBytes()); 
      byte[] a = digest.digest(); 
      int len = a.length; 
      StringBuilder sb = new StringBuilder(len << 1); 
      for (int i = 0; i < len; i++) { 
       sb.append(Character.forDigit((a[i] & 0xf0) >> 4, 16)); 
       sb.append(Character.forDigit(a[i] & 0x0f, 16)); 
      } 
      return sb.toString(); 
     } catch (NoSuchAlgorithmException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 
} 

Logcat:

01-18 18: 39: 53,383: ERRORE/XXX (7113): java.lang.IllegalStateException: Content è stato consumato

+2

Cosa "non funziona" a riguardo? – Falmarri

+0

Hai visto Logcat vicino alla finestra della tua console, se non sei in grado di vederlo, quindi fai clic su Menu di Windows, quindi su Altri e Chosse Logcat, e comunicaci se hai problemi a mostrare logcat o no, pls be quick –

+0

in il logger non visualizza log con XXX – user547995

risposta

105

Si può consumare Content solo in una sola volta da un Entity

nella linea:

final JSONObject jObject = new JSONObject(EntityUtils.toString(resEntity)); 

avete consumato il contenuto e ancora una volta si utilizza lo stesso a qui:

Log.e("XXX",EntityUtils.toString(resEntity)); 

Ecco il motivo per cui è causa IllegalStateException: Content has been consumed

Quindi la soluzione è qui:

String _response=EntityUtils.toString(resEntity); // content will be consume only once 
final JSONObject jObject=new JSONObject(_response); 
Log.e("XXX",_response); 
+29

Ugh, a volte (ok un sacco di tempo) java è così ritardato. – Timmmm

+0

Fantastico, fantastico. –

+0

OMG, mi hai salvato la vita :) –

3

In primo luogo, questo deve essere un errore che ogni singolo nuovo programmatore Android fa e viene chiesto qui ogni singolo giorno. Hai

user.getText().toString()!= ""&& pw.getText().toString()!= "" 

Questo non fa quello che vuoi. È necessario

!user.getText().toString().equals("")&& !pw.getText().toString().equals("") 

Inoltre, è necessario stampare lo stacktrace. Nella vostra eccezione, è necessario

e.printStackTrace() 

invece di registrazione

e.toString() 
+0

grazie per il vostro aiuto .... ma questa non è la soluzione per risolvere il mio problema – user547995

+0

Btw, su questo argomento off-topic, preferisco l'eccezione 'Log.e (TAG," Errore ", eccezione)' su ' .toString() '. – EboMike

+0

chiunque potrebbe compilare quella classe (utente: test pw: sers) – user547995

1

Mi sono appena occupato di un caso di controllo nullo sull'entità che lo ha segnalato come "consumato". Spero che il mio mal di testa aiuti qualcun altro là fuori. La risposta di

Vikas Patidar mi ha aiutato a capire la chiave dell'enigma, tante grazie

5

è accade anche se si sta scrivendo la dichiarazione che consumano nelle espressioni del debugger !!!
(ad esempio se stai facendo "guardare" qualcosa come EntityUtils.toString(resEntity))

Problemi correlati