Java Android登录界面-内容已被使用
大家好,我正在尝试执行以下代码,这是我在用于登录身份验证的应用程序教程中看到的代码,但我在执行时遇到以下错误,有人能帮我解决吗?我已经读过其他相关的文章,但我要么找不到解决方案,要么我的编程技能无法很好地解释和解决它 我的日志:Java Android登录界面-内容已被使用,java,android,Java,Android,大家好,我正在尝试执行以下代码,这是我在用于登录身份验证的应用程序教程中看到的代码,但我在执行时遇到以下错误,有人能帮我解决吗?我已经读过其他相关的文章,但我要么找不到解决方案,要么我的编程技能无法很好地解释和解决它 我的日志: 01-29 01:26:26.997: I/System.out(2250): MessageContent has been consumed 01-29 01:26:26.997: W/System.err(2250): java.lang.IllegalState
01-29 01:26:26.997: I/System.out(2250): MessageContent has been consumed
01-29 01:26:26.997: W/System.err(2250): java.lang.IllegalStateException: Content has been consumed
01-29 01:26:26.997: W/System.err(2250): at org.apache.http.entity.BasicHttpEntity.getContent(BasicHttpEntity.java:84)
01-29 01:26:27.007: W/System.err(2250): at org.apache.http.conn.BasicManagedEntity.getContent(BasicManagedEntity.java:100)
01-29 01:26:27.007: W/System.err(2250): at com.example.kibria.MainActivity.onClick(MainActivity.java:90)
01-29 01:26:27.007: W/System.err(2250): at android.view.View.performClick(View.java:4438)
01-29 01:26:27.007: W/System.err(2250): at android.view.View$PerformClick.run(View.java:18422)
01-29 01:26:27.007: W/System.err(2250): at android.os.Handler.handleCallback(Handler.java:733)
01-29 01:26:27.007: W/System.err(2250): at android.os.Handler.dispatchMessage(Handler.java:95)
01-29 01:26:27.007: W/System.err(2250): at android.os.Looper.loop(Looper.java:136)
01-29 01:26:27.017: W/System.err(2250): at android.app.ActivityThread.main(ActivityThread.java:5017)
01-29 01:26:27.017: W/System.err(2250): at java.lang.reflect.Method.invokeNative(Native Method)
01-29 01:26:27.017: W/System.err(2250): at java.lang.reflect.Method.invoke(Method.java:515)
01-29 01:26:27.017: W/System.err(2250): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
01-29 01:26:27.017: W/System.err(2250): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
01-29 01:26:27.017: W/System.err(2250): at dalvik.system.NativeStart.main(Native Method
我的Java类:
public class MainActivity extends ActionBarActivity implements OnClickListener {
EditText etUser, etPass;
Button bLogin;
String username, password;
HttpClient httpclient;
HttpPost httppost;
ArrayList<NameValuePair> nameValuePairs;
HttpResponse response;
HttpEntity entity;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().build();
StrictMode.setThreadPolicy(policy);
setContentView(R.layout.activity_main);
etUser = (EditText) findViewById(R.id.etUser);
etPass = (EditText) findViewById(R.id.etPass);
bLogin = (Button) findViewById(R.id.bSubmit);
bLogin.setOnClickListener(this);
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
httpclient = new DefaultHttpClient();
httppost = new HttpPost("http://10.0.2.2:8080/kibria/index.php");
username = etUser.getText().toString();
password = etPass.getText().toString();
try{
nameValuePairs = new ArrayList<NameValuePair>();
nameValuePairs.add(new BasicNameValuePair("username", username));
nameValuePairs.add(new BasicNameValuePair("password", password));
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
response = httpclient.execute(httppost);
if(response.getStatusLine().getStatusCode()==200){
entity = response.getEntity();
if(entity.getContent()!=null){
InputStream instream = response.getEntity().getContent();
JSONObject jsonResponse = new JSONObject(convertStreamToString(instream));
String retUser = jsonResponse.getString("user");
String retPass = jsonResponse.getString("pass");
if(username.equals(retUser)&& password.equals(retPass)){
SharedPreferences sp = getSharedPreferences("logindetails", 0);
SharedPreferences.Editor spedit = sp.edit();
spedit.putString("user", username);
spedit.putString("pass", password);
spedit.commit();
Toast.makeText(getBaseContext(), "SUCCESS!", Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(getBaseContext(), "Invalid Login Details", Toast.LENGTH_SHORT).show();
}
}
}
}catch (Exception e){
System.out.println("Message"+e.getMessage());
e.printStackTrace();
Toast.makeText(getBaseContext(), "Connection Error!!!", Toast.LENGTH_SHORT).show();
}
}
private static String convertStreamToString(InputStream is) {
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
StringBuilder sb = new StringBuilder();
String line = null;
try{
while ((line = reader.readLine()) !=null){
sb.append(line + "\n");
}
} catch(IOException e){
e.printStackTrace();
} finally {
try{
is.close();
}catch (IOException e){
e.printStackTrace();
}
}
return sb.toString();
}
}
公共类MainActivity扩展了ActionBarActivity实现OnClickListener{
编辑文本etUser,etPass;
按钮博客;
字符串用户名、密码;
HttpClient-HttpClient;
HttpPost-HttpPost;
ArrayList名称值对;
HttpResponse响应;
http实体;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
StrictMode.ThreadPolicy policy=新建StrictMode.ThreadPolicy.Builder().build();
StrictMode.setThreadPolicy(策略);
setContentView(R.layout.activity_main);
etUser=(EditText)findViewById(R.id.etUser);
etPass=(EditText)findViewById(R.id.etPass);
bLogin=(按钮)findviewbyd(R.id.bSubmit);
setOnClickListener(this);
}
@凌驾
公共void onClick(视图v){
//TODO自动生成的方法存根
httpclient=新的DefaultHttpClient();
httppost=新的httppost(“http://10.0.2.2:8080/kibria/index.php");
username=etUser.getText().toString();
password=etPass.getText().toString();
试一试{
nameValuePairs=新的ArrayList();
添加(新的BasicNameValuePair(“用户名”,username));
添加(新的BasicNameValuePair(“密码”,password));
setEntity(新的UrlEncodedFormEntity(nameValuePairs));
response=httpclient.execute(httppost);
if(response.getStatusLine().getStatusCode()==200){
entity=response.getEntity();
if(entity.getContent()!=null){
InputStream instream=response.getEntity().getContent();
JSONObject jsonResponse=新的JSONObject(convertStreamToString(instream));
String retUser=jsonResponse.getString(“用户”);
String retPass=jsonResponse.getString(“pass”);
if(username.equals(retUser)和password.equals(retPass)){
SharedReferences sp=GetSharedReferences(“登录详细信息”,0);
SharedReferences.Editor spedit=sp.edit();
spedit.putString(“用户”,用户名);
spedit.putString(“pass”,密码);
提交();
Toast.makeText(getBaseContext(),“SUCCESS!”,Toast.LENGTH\u SHORT.show();
}否则{
Toast.makeText(getBaseContext(),“无效的登录详细信息”,Toast.LENGTH_SHORT.show();
}
}
}
}捕获(例外e){
System.out.println(“Message”+e.getMessage());
e、 printStackTrace();
Toast.makeText(getBaseContext(),“连接错误!!!”,Toast.LENGTH\u SHORT.show();
}
}
私有静态字符串convertStreamToString(InputStream为){
BufferedReader reader=新的BufferedReader(新的InputStreamReader(is));
StringBuilder sb=新的StringBuilder();
字符串行=null;
试一试{
而((line=reader.readLine())!=null){
sb.追加(第+行“\n”);
}
}捕获(IOE异常){
e、 printStackTrace();
}最后{
试一试{
is.close();
}捕获(IOE异常){
e、 printStackTrace();
}
}
使某人返回字符串();
}
}
我的PHP文件:
<?php
$dbhost = "localhost";
$dbuser = "root";
$dbpass = "";
$dbdb = "mobiledb";
$connect = mysqli_connect($dbhost, $dbuser, $dbpass)
or die("connection error");
mysqli_select_db($connect,$dbdb) or die ("database selection error");
$username = $_POST['username'];
$password = $_POST['password'];
$query = mysqli_query($connect, "SELECT * FROM androidlogin WHERE user = '$username'AND pass = '$password'");
$num = mysqli_num_rows($query);
if($num==1){
while($list=mysqli_fetch_assoc($query)){
$output = $list;
echo json_encode($output);
mysqli_close($connect);
}
}
java.lang.IllegalStateException:内容已被消费
因为您多次调用getContent()
方法
如你所见:
如果此实体不可重复且流
以前已经获得过
将其固定为:
InputStream instream = response.getEntity().getContent();
if(instream!=null){
//... your code here
}
谢谢你的回复。你的意思是说,如果可以的话,代码是什么?我只需要一个任务?严格的线程策略是否有助于它的执行?先生,我做了您提到的更改,但现在我得到了以下错误org.json.JSONException:字符0处输入结束of@Sid:什么错误?使用最新代码更新问题error@Sid:应用程序可能获取无效的json字符串。因此,请尝试检查您从这里的服务器得到的响应convertStreamToString(instream)
对不起,先生,昨天我无法回复。您的回答解决了我关于内容被消费的问题&我一定会按照您的建议研究我的方法。谢谢
01-29 02:47:39.722: I/System.out(2081): MessageEnd of input at character 0 of
01-29 02:47:39.722: W/System.err(2081): org.json.JSONException: End of input at character 0 of
01-29 02:47:39.732: W/System.err(2081): at org.json.JSONTokener.syntaxError(JSONTokener.java:450)
01-29 02:47:39.732: W/System.err(2081): at org.json.JSONTokener.nextValue(JSONTokener.java:97)
01-29 02:47:39.742: W/System.err(2081): at org.json.JSONObject.<init>(JSONObject.java:155)
01-29 02:47:39.742: W/System.err(2081): at org.json.JSONObject.<init>(JSONObject.java:172)
01-29 02:47:39.742: W/System.err(2081): at com.example.kibria.MainActivity.onClick(MainActivity.java:99)
01-29 02:47:39.742: W/System.err(2081): at android.view.View.performClick(View.java:4438)
01-29 02:47:39.742: W/System.err(2081): at android.view.View$PerformClick.run(View.java:18422)
01-29 02:47:39.742: W/System.err(2081): at android.os.Handler.handleCallback(Handler.java:733)
01-29 02:47:39.742: W/System.err(2081): at android.os.Handler.dispatchMessage(Handler.java:95)
01-29 02:47:39.752: W/System.err(2081): at android.os.Looper.loop(Looper.java:136)
01-29 02:47:39.752: W/System.err(2081): at android.app.ActivityThread.main(ActivityThread.java:5017)
01-29 02:47:39.752: W/System.err(2081): at java.lang.reflect.Method.invokeNative(Native Method)
01-29 02:47:39.752: W/System.err(2081): at java.lang.reflect.Method.invoke(Method.java:515)
01-29 02:47:39.752: W/System.err(2081): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
01-29 02:47:39.752: W/System.err(2081): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
01-29 02:47:39.752: W/System.err(2081): at dalvik.system.NativeStart.main(Native Method)
You need to take AsynkTask class for server work then it will work fine.
InputStream instream = response.getEntity().getContent();
if(instream!=null){
//... your code here
}