我有这段代码,它对我来说效果很好,并让我可以访问数据库。 唯一的问题是我想添加消息、Toast 或其他东西以在主键值重复的情况下显示错误......
这是我的异步任务的代码(我添加了 Toast,但它不起作用:( )
Button con=(Button)findViewById(R.id.inscription);
con.setOnClickListener(new OnClickListener() {
public void onClick(View v){
new CreateNewUser().execute();
}
});
}
class CreateNewUser extends AsyncTask<String, String, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
protected String doInBackground(String... args) {
@SuppressWarnings("deprecation")
Date d=new Date(an-2800,mn,jn);
Date d1=new Date(ap-2800,mp,jp);
String datenaiss=d.toString();
String deliv=d1.toString();
EditText pseud=(EditText) findViewById(R.id.pseud);
String pseudo = pseud.getText().toString();
EditText name=(EditText) findViewById(R.id.nom);
String nom = name.getText().toString();
EditText prenom=(EditText) findViewById(R.id.pren);
String pren =prenom.getText().toString();
EditText cinn=(EditText) findViewById(R.id.cin);
String cin = cinn.getText().toString();
EditText ag=(EditText) findViewById(R.id.age);
String age = ag.getText().toString();
EditText tele=(EditText) findViewById(R.id.tel);
String tel = tele.getText().toString();
EditText mail=(EditText) findViewById(R.id.email);
String email = mail.getText().toString();
EditText adress=(EditText) findViewById(R.id.adresse);
String adresse = adress.getText().toString();
EditText motdp=(EditText) findViewById(R.id.pwd);
String pwd = motdp.getText().toString();
EditText vill=(EditText) findViewById(R.id.ville);
String ville = vill.getText().toString();
EditText numpermi=(EditText) findViewById(R.id.numperm);
String numperm = numpermi.getText().toString();
String x="http://192.168.1.5/add_user.php";
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("pseudo", pseudo));
params.add(new BasicNameValuePair("mdp", pwd));
params.add(new BasicNameValuePair("datenaiss", datenaiss));
params.add(new BasicNameValuePair("deliv", deliv));
params.add(new BasicNameValuePair("nom", nom));
params.add(new BasicNameValuePair("prenom", pren));
params.add(new BasicNameValuePair("cin", cin));
params.add(new BasicNameValuePair("age", age));
params.add(new BasicNameValuePair("tel", tel));
params.add(new BasicNameValuePair("email", email));
params.add(new BasicNameValuePair("adresse", adresse));
params.add(new BasicNameValuePair("ville", ville));
params.add(new BasicNameValuePair("numperm", numperm));
JSONObject json;
try {
json = jsonParser.makeHttpRequest(x,"POST", params);
Log.d("Create Response", json.toString());
try {
int success = json.getInt(TAG_SUCCESS);
if (success == 1) {
Toast.makeText(MainActivity.this,"Ajouté avec succés", Toast.LENGTH_LONG).show();}
else
Toast.makeText(getBaseContext(),"echec",Toast.LENGTH_LONG).show();}
catch(JSONException e) {
e.printStackTrace();
}
} catch (JSONException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
// check log cat fro response
return null;}
protected void onPostExecute(String file_url) {
// dismiss the dialog once done
}
这是我的php add_user文件的代码:...........
// mysql inserting a new row
$result = mysql_query("INSERT INTO utilisateur VALUES('$pseudo', '$mdp', '$nom', '$prenom','$cin', '$datenaiss', '$tel', '$email', '$adresse', '$ville', '$numperm', '$deliv')");
// check if row inserted or not
if ($result) {
// successfully inserted into database
$response["success"] = 1;
$response["message"] = "Product successfully created.";
// 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);
}
}?>
你们能告诉我我能做什么吗? 如果有不同的方法可以做同样的事情,我很想尝试一下:D
您无法从后台线程触摸 UI。若要显示 Toast,必须使用在 ui 上运行线程方法。或使用异步任务的进度更新方法。对于空值,请保持检查。如果这种情况,它也会出现异常,并且可能会使应用程序崩溃。
您正在尝试在doInBackground方法上创建一个Toast,但是您显然无法执行此操作,因为doInBackground是从后台线程调用的。只能在 UI 线程中创建 Toast。因此,我的建议是在 onPostExecute 方法中处理您的服务器响应和 Toasts 创建,该方法在 UI 线程中执行。您可以执行以下操作:
class MyCystomObject {
private JSONObject json;
private String file_url;
public MyCystomObject(JSONObject json, String file_url) {
this.json = json;
this.file_url = file_url;
}
public void setJson(JSONObject json) { this.json = json; }
public void setFile_url(String file_url) { this.file_url = file_url; }
public JSONObject getJson() { return json; }
public String getFile_url() { return file_url; }
}
创建此类以保存从服务器和"file_url"字符串(我不知道它是如何传递给onPostExecute)的JSON对象并将其传递给onPostExecute。因此,doInBackground和onPostExecute可以看起来像:
protected String doInBackground(String... args) {
....
JSONObject json;
MyCystomObject myCystomObject;
json = jsonParser.makeHttpRequest(x,"POST", params);
Log.d("Create Response", json.toString());
myCystomObject = new MyCustomObject(json, your_file_url);
return myCystomObject;
}
protected void onPostExecute(MyCystomObject myCystomObject) {
// here you can handle the responce you receive from server and display the appropriate toast message...
JSONObject json = myCustomObject.getJson();
try {
int success = json.getInt(TAG_SUCCESS);
if (success == 1) {
Toast.makeText(MainActivity.this,"Ajouté avec succés", Toast.LENGTH_LONG).show();}
else
Toast.makeText(getBaseContext(),"echec",Toast.LENGTH_LONG).show();}
catch(JSONException e) {
e.printStackTrace();
}
}