此活动尝试接收从另一个活动传递的文本,并将其组合以形成具有查询字符串的URL。然后将url传递给asynctask函数以从服务器获取数据并将其显示到textview。我不明白我哪里出错了。
public class GetDetails extends Activity {
public static final String address = null;
String result = null;
InputStream is = null;
StringBuilder sb = null;
ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.simpleview);
Bundle extras=getIntent().getExtras();
String i= extras.getString("id");
new DetailThread().execute(i);
}
class DetailThread extends AsyncTask<String, Void, Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected Void doInBackground(String... text) {
String ix=text.toString();
String address = "http://server/foreach.php?id="+ix;
parseJson(address);
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
};
}
void parseJson(String url) {
try {
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(url);
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
is = entity.getContent();
} catch (Exception e) {
Toast.makeText(getBaseContext(), e.toString(), Toast.LENGTH_LONG)
.show();
}
// response to inputstream
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(
is, "UTF-8"));
sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
is.close();
result = sb.toString();
} catch (Exception e) {
Toast.makeText(getBaseContext(), e.toString(), Toast.LENGTH_LONG)
.show();
}
// to string
try {
JSONArray jArray = new JSONArray(result);
JSONObject json_data = null;
String name=null;
String country=null;
TextView tv = (TextView) findViewById(R.id.textView1);
TextView tv2 = (TextView) findViewById(R.id.textView2);
for (int i = 0; i < jArray.length(); i++) {
json_data = jArray.getJSONObject(i);
name = "Name: "+json_data.getString("Name");
country ="Country: "+json_data.getString("Country");
tv.setText(name);
tv2.setText(country);
}
}
//json parsing exceptions handled here
}
}
}
当我运行这个时,我得到的标签是“大文本”和“中文本”而不是必须在文本字段中显示的数据
答案 0 :(得分:1)
您已在parseJson
中调用doInBackground
方法。
doInBackground
正在单独的线程中运行。所以不允许在非UI线程上执行UI操作。
你需要使用
首先 runOnUiThread(Runnable)更新textview
中的值,即只需在parseJson
中调用runonUIThread
方法或
second 在doInBackground中返回json字符串,并使用onPostExecute中的参数调用onPostExecute中的parseJSOn方法。
第三次在您的onCreate中创建处理程序并使用handler.post(runnbale)来更新您的UI
答案 1 :(得分:0)
您正在尝试从在单独线程上运行的doInBackground()方法设置TextView值。在Android中,您不能从其他线程更改UI。
你可以使用onPreExecute(),onPostExecute()或onProgressUpdate()与publishProgress()一起使用,这些都在UI线程上运行以更新TextViews。