我得到“NetworkOnMainThreadException”.. :-( 所以..
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("id", id));
// 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
product = productObj.getJSONObject(0);
// product with this id found
// Edit Text
// new LoadTextFromJSONToTextViews().execute();
// display product data in EditText
productDetail1.setText(product.getString(OPTION_ONE));
productDetail2.setText(product.getString(OPTION_TWO));
productDetail3.setText(product.getString(OPTION_THREE));
productDetail4.setText(product.getString(OPTION_FOUR));
productDetail5.setText(product.getString(OPTION_FIVE));
} else {
// product with id not found
}
} catch (JSONException e) {
e.printStackTrace();
}
}
});
return null;
}
我知道,我使用“runOnUiThread”执行此操作,但我必须这样做,因为如果不是,我将成为“只有创建视图层次结构的原始线程才能触及其视图。”这就是我为什么要添加额外的其中包含从上一个活动中单击的视图的ID到我要加载所单击视图的详细信息的位置。有人选择,如何在没有“runOnUIThread”的情况下解决这个问题?感谢您的回复: - )
答案 0 :(得分:3)
AsyncTask中有3个主要功能:
1)onPreExecute
2)doInBackground
3)onPostExecute
您应该在doInBackground中进行所有网络通信,因为这将在后面的单独线程中完成。
当您想要更新UI时,可以在onPostExecute中执行此操作(在UI线程上自动调用此函数)。
要将信息从doInBackground发送到onPostExecute,您只需通过“返回数据”返回doInBackground中的数据;然后它就可以作为onPostExecute中的参数使用。
答案 1 :(得分:0)
如果你想对ui做任何事情,那么你应该使用onPostExecute()方法。 在onPostExecute()方法中添加代码。 从doInBackground(),只需更改成功变量的值...并在onPostExecute()中使用它作为if条件。
答案 2 :(得分:0)
onPreExecute(),onPostExecute(),onProgressUpdate()运行UI线程。 你可以用这种方法更新ui。
但是doInBackground()运行非ui线程。不要更新ui元素。
我修改了你的代码。
protected JSONObject doInBackground(String... params) {
try {
// Building Parameters
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("id", id));
// 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());
return json;
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
protected void onPostExecute(JSONObject result) {
super.onPostExecute(result);
int success;
if(result!=null){
try{
success = json.getInt(TAG_SUCCESS);
if (success == 1) {
JSONArray productObj = result
.getJSONArray(TAG_PRODUCT); // JSON Array
// get first product object from JSON Array
product = productObj.getJSONObject(0);
// product with this id found
// Edit Text
// display product data in EditText
productDetail1.setText(product.getString(OPTION_ONE));
productDetail2.setText(product.getString(OPTION_TWO));
productDetail3.setText(product.getString(OPTION_THREE));
productDetail4.setText(product.getString(OPTION_FOUR));
productDetail5.setText(product.getString(OPTION_FIVE));
}else{
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}
了解AsyncTask,请阅读此http://developer.android.com/reference/android/os/AsyncTask.html
答案 3 :(得分:-2)
您似乎使用以下代码触摸主UI线程:
// display product data in EditText
productDetail1.setText(product.getString(OPTION_ONE));
productDetail2.setText(product.getString(OPTION_TWO));
productDetail3.setText(product.getString(OPTION_THREE));
productDetail4.setText(product.getString(OPTION_FOUR));
productDetail5.setText(product.getString(OPTION_FIVE));
所以你只把它们放在runOnUiThread
中:
protected String doInBackground(String... params) {
(...)
if (success == 1) {
// successfully received product details
JSONArray productObj = json.getJSONArray(TAG_PRODUCT); // JSON Array
// get first product object from JSON Array
product = productObj.getJSONObject(0);
// product with this id found
// Edit Text
// new LoadTextFromJSONToTextViews().execute();
// display product data in EditText
runOnUiThread(new Runnable() {
public void run() {
// display product data in EditText
productDetail1.setText(product.getString(OPTION_ONE));
productDetail2.setText(product.getString(OPTION_TWO));
productDetail3.setText(product.getString(OPTION_THREE));
productDetail4.setText(product.getString(OPTION_FOUR));
productDetail5.setText(product.getString(OPTION_FIVE));
}
});
} else {
(...)