我已经按照本教程实现了crud php mysql android应用程序 但当我执行android项目时,我点击了产品列表中的一个项目 我有这个错误:
android.osNetworkOnMainthreadException
这里是asynctask doinbackground:
protected String doInBackground(String... params) {
// updating UI from Background Thread
runOnUiThread(new Runnable() {
public void run() {
// Check for success tag
int success;
try {
// Building Parameters
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("pid", pid));
// getting product details by making HTTP request
// Note that product details url will use GET request
JSONObject json = jsonParser.makeHttpRequest(
url_product_detials, "GET", params);
// check your log for json response
Log.d("Single Product Details", json.toString());
// json success tag
success = json.getInt(TAG_SUCCESS);
if (success == 1) {
// successfully received product details
JSONArray productObj = json
.getJSONArray(TAG_PRODUCT); // JSON Array
// get first product object from JSON Array
JSONObject product = productObj.getJSONObject(0);
// product with this pid found
// Edit Text
txtName = (EditText) findViewById(R.id.inputName);
txtPrice = (EditText) findViewById(R.id.inputPrice);
txtDesc = (EditText) findViewById(R.id.inputDesc);
// display product data in EditText
txtName.setText(product.getString(TAG_NAME));
txtPrice.setText(product.getString(TAG_PRICE));
txtDesc.setText(product.getString(TAG_DESCRIPTION));
}else{
// product with pid not found
}
} catch (JSONException e) {
e.printStackTrace();
}
}
});
return null;
}
我删除了runOnUithread,但它产生了另一个错误
如何解决此问题
答案 0 :(得分:1)
删除runOnUiThread。
删除此代码:
txtName = (EditText) findViewById(R.id.inputName);
txtPrice = (EditText) findViewById(R.id.inputPrice);
txtDesc = (EditText) findViewById(R.id.inputDesc);
// display product data in EditText
txtName.setText(product.getString(TAG_NAME));
txtPrice.setText(product.getString(TAG_PRICE));
txtDesc.setText(product.getString(TAG_DESCRIPTION));
并将其添加到onPostExecute,但您必须编辑asynctask以返回对象product
并在onPostExecute中使用它。
一个非常快速的解决方案是将上面提到的代码放在runOnUiThread中。
答案 1 :(得分:0)
您不需要在doInBackground()
内执行runOnUiThread,因为您只需要显示产品详细信息,您可以在onPostExecute()
内直接执行此操作。
尝试以下步骤:
doInBackground()
返回产品JSONObject。onPostExecute()
:txtName.setText(product.getString(TAG_NAME)); txtPrice.setText(product.getString(TAG_PRICE)); txtDesc.setText(product.getString(TAG_DESCRIPTION));
答案 2 :(得分:0)
分开你的工作。