将数据提交到mysql后,app强制关闭

时间:2014-12-02 06:16:43

标签: java php android mysql

我尝试了一个关于从Android将数据插入mysql的互联网教程 在activity_main.xml中,有一个注册新用户的按钮 所以我把所有的信息,如名字等等。
当用户点击提交按钮时,它应该重定向回activity_main.xml。
但是,当我单击提交时,应用程序被强制关闭,并且数据未插入到mysql数据库中。
我的问题是,代码究竟出了什么问题?
请给我建议。 代码中的所有内容都与我用于Android应用程序的内容相同。此外,我在这里提供日志跟踪。 任何帮助表示赞赏...

regactivity.java

package com.example.estate;

import java.util.ArrayList;
import java.util.List;

import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

public class RegActivity extends Activity {

// Progress Dialog
private ProgressDialog pDialog;

JSONParser jsonParser = new JSONParser();
EditText fname;
EditText lname;
EditText username;
EditText password;
EditText location;
EditText contact;

Button btnreg;
Button btncancel;

// url to create new product
private static String url_new_user = "http://192.168.43.236/Estate_Conny/new_user.php";

// JSON Node names
private static final String TAG_SUCCESS = "success";

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.reg_activity);

    // Edit Text
    fname = (EditText) findViewById(R.id.fname);
    lname = (EditText) findViewById(R.id.lname);
    username = (EditText) findViewById(R.id.uname);
    password = (EditText) findViewById(R.id.pass);
    location = (EditText) findViewById(R.id.addr);
    contact = (EditText) findViewById(R.id.contact);


    // Create button
    btnreg = (Button) findViewById(R.id.btnreg);
    btncancel = (Button) findViewById(R.id.btncancel);

    // button click event
    btnreg.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View view) {
            // creating new product in background thread
            new CreateNewProduct().execute();
        }
    });

    btncancel.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View view) {
            finish();
            Intent i = new Intent(getApplicationContext(), MainActivity.class);
            startActivity(i);
        }
    });
}

/**
 * Background Async Task to Create new product
 * */
class CreateNewProduct extends AsyncTask<String, String, String> {

    /**
     * Before starting background thread Show Progress Dialog
     * */
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pDialog = new ProgressDialog(RegActivity.this);
        pDialog.setMessage("Registering New User..");
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(true);
        pDialog.show();
    }

    /**
     * Creating product
     * */
    protected String doInBackground(String... args) {
        String Firstname = fname.getText().toString();
        String Lastname = lname.getText().toString();
        String Username = username.getText().toString();
        String Password = password.getText().toString();
        String Address = location.getText().toString();
        String Contact = contact.getText().toString();

        // Building Parameters
        List<NameValuePair> params = new ArrayList<NameValuePair>();
        params.add(new BasicNameValuePair("fname", Firstname));
        params.add(new BasicNameValuePair("lname", Lastname));
        params.add(new BasicNameValuePair("username", Username));
        params.add(new BasicNameValuePair("password", Password));
        params.add(new BasicNameValuePair("location", Address));
        params.add(new BasicNameValuePair("contact", Contact));

        // getting JSON Object
        // Note that create product url accepts POST method
        JSONObject json = jsonParser.makeHttpRequest(url_new_user,
                "POST", params);

        // check log cat fro response
        Log.d("Create Response", json.toString());

        // check for success tag
        try {
            int success = json.getInt(TAG_SUCCESS);

            if (success == 1) {
                // successfully created product
                finish();
                Intent i = new Intent(getApplicationContext(), MainActivity.class);
                startActivity(i);
            } else {
                // failed to create product
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }

        return null;
    }

    /**
     * After completing background task Dismiss the progress dialog
     * **/
    protected void onPostExecute(String file_url) {
        // dismiss the dialog once done
        pDialog.dismiss();
    }

}
}

MainActivity.java

package com.example.estate;

import java.util.ArrayList;
import java.util.List;

import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONException;
import org.json.JSONObject;

import com.example.estate.RegActivity;
//import com.example.androidhive.NewProductActivity;
import com.example.estate.R;
import com.example.estate.JSONParser;
import com.example.estate.MainActivity;
//import com.example.estate.ReadComments;
import com.example.estate.RegActivity;
 //import com.example.estate.Login.AttemptLogin;

import android.os.AsyncTask;
import android.os.Bundle;
 import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;


 public class MainActivity extends Activity implements OnClickListener{

Button btnlogin;
Button btnreg;
Button btncancel;

EditText username;
EditText password;

private ProgressDialog pDialog;

 JSONParser jsonParser = new JSONParser();

 private static final String LOGIN_URL = "http://192.168.43.101/Estate_Conny/login.php";


 private static final String TAG_SUCCESS = "success";
    private static final String TAG_MESSAGE = "message";


@Override
 public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // Buttons
    btnlogin = (Button) findViewById(R.id.btnlogin );
    btnreg = (Button) findViewById(R.id.btncreate);
    btncancel = (Button) findViewById(R.id.btnquit);

    username = (EditText) findViewById(R.id.inputname);
    password = (EditText) findViewById(R.id.inputpassword);

    btnreg.setOnClickListener(this);
    btnlogin.setOnClickListener(this);
    btncancel.setOnClickListener(this);

    }

 @Override
 public void onClick(View v) {
    // TODO Auto-generated method stub
    switch (v.getId()) {
    case R.id.btnlogin:
            new AttemptLogin().execute();
        break;
    case R.id.btncreate:
            Intent i = new Intent(this, RegActivity.class);
            startActivity(i);
        break;

    case R.id.btnquit:
        finish();
    break;

    default:
        break;
    }
 } 

 class AttemptLogin extends AsyncTask<String, String, String> {

     /**
     * Before starting background thread Show Progress Dialog
     * */
    boolean failure = false;

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pDialog = new ProgressDialog(MainActivity.this);
        pDialog.setMessage("Logging in User...");
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(true);
        pDialog.show();
    }

    @Override
    protected String doInBackground(String... args) {
        // TODO Auto-generated method stub
         // Check for success tag
        int success;
        String user = username.getText().toString();
        String pass = password.getText().toString();
        try {
            // Building Parameters
            List<NameValuePair> params = new ArrayList<NameValuePair>();
            params.add(new BasicNameValuePair("username", user));
            params.add(new BasicNameValuePair("password", pass));

            Log.d("request!", "starting");
            // getting product details by making HTTP request
            JSONObject json = jsonParser.makeHttpRequest(
                   LOGIN_URL, "POST", params);

            // check your log for json response
            Log.d("Login attempt", json.toString());

            // json success tag
            success = json.getInt(TAG_SUCCESS);
            if (success == 1) {
                Log.d("Login Successful!", json.toString());
                Intent i = new Intent(MainActivity.this, ScreenActivity.class);
                finish();
                startActivity(i);
                return json.getString(TAG_MESSAGE);
            }else{
                Log.d("Login Failure!", json.getString(TAG_MESSAGE));
                return json.getString(TAG_MESSAGE);

            }
        } catch (JSONException e) {
            e.printStackTrace();
        }

        return null;

    }
    /**
     * After completing background task Dismiss the progress dialog
     * **/
    protected void onPostExecute(String file_url) {
        // dismiss the dialog once product deleted
        pDialog.dismiss();
        if (file_url != null){
            Toast.makeText(MainActivity.this, file_url, Toast.LENGTH_LONG).show();
        }

    }

}
}

new_user.php

<?php

/*
* Following code will create a new product row
* All product details are read from HTTP Post Request
*/

// array for JSON response
$response = array();

/ check for required fields
if (isset($_POST['fname']) && isset($_POST['lname']) && isset($_POST['username']) &&     isset($_POST['password']) && isset($_POST['location']) && isset($_POST['contact'])) {

$fname = $_POST['fname'];
$lname = $_POST['lname'];
$username = $_POST['username'];
$password = $_POST['password'];
$location = $_POST['location'];
$contact = $_POST['contact'];

// include db connect class
require_once __DIR__ . '/db_connect.php';

// connecting to db
$db = new DB_CONNECT();

// mysql inserting a new row
$result = mysql_query("INSERT INTO user(firstname, lastname, username, password, location, contact) VALUES('$fname', '$lname', '$username','$password','$location','$contact')");

// check if row inserted or not
if ($result) {
    // successfully inserted into database
    $response["success"] = 1;
    $response["message"] = "User successfully Registered.";

    // echoing JSON response
    echo json_encode($response);
} else {
    // failed to insert row
    $response["success"] = 0;
    $response["message"] = "Oops! An error occurred.";

    // echoing JSON response
    echo json_encode($response);
}
} else {
// required field is missing
$response["success"] = 0;
$response["message"] = "Required field(s) is missing";

// echoing JSON response
echo json_encode($response);
}
?>

Log_traces:

Process: agrawal.trial.server, PID: 21767
   java.lang.RuntimeException: An error occured while executing doInBackground()
           at android.os.AsyncTask$3.done(AsyncTask.java:300)
           at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
           at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
           at java.util.concurrent.FutureTask.run(FutureTask.java:242)
           at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
           at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
           at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
           at java.lang.Thread.run(Thread.java:841)
    Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
           at android.os.Handler.<init>(Handler.java:200)
           at android.os.Handler.<init>(Handler.java:114)
           at android.widget.Toast$TN.<init>(Toast.java:345)
           at android.widget.Toast.<init>(Toast.java:100)
           at android.widget.Toast.makeText(Toast.java:256)
           at agrawal.trial.server.RegActivity$CreateNewProduct.doInBackground(RegActivity.java:116)
           at agrawal.trial.server.RegActivity$CreateNewProduct.doInBackground(RegActivity.java:89)
           at android.os.AsyncTask$2.call(AsyncTask.java:288)
           at java.util.concurrent.FutureTask.run(FutureTask.java:237)
            at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
            at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
            at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
            at java.lang.Thread.run(Thread.java:841)

 java.lang.IllegalArgumentException: HTTP entity may not be null
           at org.apache.http.util.EntityUtils.toString(EntityUtils.java:110)
           at org.apache.http.util.EntityUtils.toString(EntityUtils.java:146)
           at miui.util.ErrorReport.b(SourceFile:363)
           at miui.util.ErrorReport.sendReportRequest(SourceFile:320)
           at miui.util.ErrorReport$2.a(SourceFile:336)
           at miui.util.ErrorReport$2.doInBackground(SourceFile:333)
           at android.os.AsyncTask$2.call(AsyncTask.java:288)
           at java.util.concurrent.FutureTask.run(FutureTask.java:237)
           at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
           at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
           at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
           at java.lang.Thread.run(Thread.java:841)
12-01 20:31:48.771    1057-1225/? W/ContextImpl﹕ Calling a method in the system process without a qualified user: android.app.ContextImpl.bindService:1585 android.content.ContextWrapper.bindService:517 miui.os.DropBoxManager.b:361 miui.os.DropBoxManager.a:350 miui.os.DropBoxManager.addText:314
12-01 20:31:48.801    1138-1150/? W/MessageQueue﹕ Handler (com.miui.internal.server.DropBoxManagerService$2) {428282d8} sending message to a Handler on a dead thread

1 个答案:

答案 0 :(得分:1)

              if (success == 1) {
                // successfully created product 

                Intent i = new Intent(getApplicationContext(), MainActivity.class);
                startActivity(i);
                finish();  //replace position of This 
            } else { 
                // failed to create product 
            } 

将此信息放入onpostExecute阻止从后方的Do中删除