我正在制作一个Android程序,用于解析互联网网页源代码中的JSON文本。它在Android 2.2中工作但我现在需要它在Android 3.0上,它需要在AsyncTask上。我有一个关于AsyncTask的背景但是我很困惑在哪里放这个和那个。在此先感谢大家:)
以下是MainActivity类中的方法:
private void jsonStuffs() {
//JSON PARSER & HOME PAGE TEXTVIEWS
client = new DefaultHttpClient();
GetMethodEx test = new GetMethodEx();
String returned;
try {
returned = test.getInternetData();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try{
String jsonStr = test.getInternetData(); //go to GetMethodEx
JSONObject obj = new JSONObject(jsonStr);
//////////////////////find temperature in the JSON in the webpage
String temperature = obj.getString("temperature");
TextView tvTemp = (TextView)findViewById(R.id.textView);
tvTemp.setText(temperature);
}
//catch (JSONException e) {
// e.printStackTrace();
//}
catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
GetMethodEx类是这样的(这将找到网页的链接,然后将其源代码转换为文本格式):
public class GetMethodEx extends Activity {
public String getInternetData() throws Exception{
BufferedReader in = null;
String data = null;
//
try{
HttpClient client = new DefaultHttpClient();
URI website = new URI("http://nhjkv.comuf.com/json_only.php");
HttpGet request = new HttpGet();
request.setURI(website);
HttpResponse response = client.execute(request);
in = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
StringBuffer sb = new StringBuffer("");
String l = "";
String nl = System.getProperty("line.separator");
while ((l = in.readLine()) !=null){
sb.append(l + nl);
}
in.close();
data = sb.toString();
return data;
}finally {
if (in !=null){
try{
in.close();
return data;
} catch (Exception e){
e.printStackTrace();
}
}
}
}
}
答案 0 :(得分:2)
您可以执行以下操作(此代码仅用于说明,根据需要进行更改)
class MyAsyncTask extends AsyncTask<String, Void, JSONObject> {
protected void onPreExecute() {
// You can set your activity to show busy indicator
//setProgressBarIndeterminateVisibility(true);
}
protected JSONObject doInBackground(String... args) {
return jsonStuffs();
}
protected void onPostExecute(final JSONObject jsonObj) {
String temperature = jsonObj.getString("temperature");
TextView tvTemp = (TextView)findViewById(R.id.textView);
tvTemp.setText(temperature);
// Stop busy indicator
//setProgressBarIndeterminateVisibility(false);
}
要调用此任务,请使用new MyAsyncTask().execute();
(如果需要,可以传递String
个参数来执行)
您可以将jsonStuffs()
更改为返回JSONObject
e.g。
private JSONObject jsonStuffs() {
// ...
String jsonStr = test.getInternetData(); //go to GetMethodEx
return new JSONObject(jsonStr);
// ...
}
答案 1 :(得分:1)
它在Android 2.2中工作但我现在需要它在Android 3.0上, 这需要在AsyncTask上。
=&GT;是的,如果您在没有实现内部线程(如AsyncTask)的情况下进行Web调用,它会在3.0中给出NetworkOnMainThreadException。
我有一个关于AsyncTask的背景但是我很困惑放在哪里 这个和那个。
=&GT;只需在AsyncTask的doInBackground()
方法中包含Web调用逻辑,在您的案例中调用doInBackground()
内的getInternetData()。
仅供参考,在doInBackground()中执行长时间运行任务时,无法直接更新UI。是,如果您想要更新UI,请执行以下任一操作:
runOnUiThread()
doInBackround()
醇>