Android 在非UI线程中读网络数据

/** 异步加载网络数据类 */
class PageTask extends AsyncTask<String, Integer, String> {
/** 加载数据进度条 */
ProgressDialog progressDialog;


public PageTask(Context context) {
progressDialog = new ProgressDialog(context);
progressDialog.setMessage("正在搜索中");
}


/** 在Background请求网络数据 */
@Override
protected String doInBackground(String... params) {
try {
return HttpQuery.httpGet(params[0]);
} catch (IOException e1) {
e1.printStackTrace();
} catch (JSONException e1) {
e1.printStackTrace();
}
return null;
}


@Override
protected void onCancelled() {
super.onCancelled();
}


@Override
protected void onPostExecute(String result) {
// 返回HTML页面的内容
System.out.println(result);
try {
// 对网络请求得到的数据进行解析

} catch (JSONException e) {
e.printStackTrace();
} catch (ParseException e) {
e.printStackTrace();
}
progressDialog.dismiss();


// 将加载的数据显示到界面

}


@Override
protected void onPreExecute() {
// 任务启动,可以在这里显示一个对话框,这里简单处理
// message.setText("onPreExecute()");
progressDialog.show();
}


@Override
protected void onProgressUpdate(Integer... values) {
// 更新进度


// progressDialog.setProgress(values[0]);
}

}



// 异步请求Server端页面数据
new PageTask(mapView.getContext()).execute(httpUrl);




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果你想在 Android 中请求网络数据时阻塞线程,可以使用 Java 中的同步机制,如使用 `synchronized` 关键字或者 `wait()` 和 `notify()` 方法。但这种方法会导致 UI 线程被阻塞,用户体验不佳,推荐使用异步任务或者线程池。 在 Android 中,异步任务是常用的请求网络数据的方法之一,它可以在后台线程执行耗时操作,然后在 UI 线程更新界面。另外,线程池可以管理多个线程,可以有效地避免线程频繁创建和销毁带来的开销。 以下是使用异步任务请求网络数据的示例代码: ```java private class MyTask extends AsyncTask<Void, Void, String> { @Override protected String doInBackground(Void... params) { // 在后台线程中执行网络请求 String result = ""; try { URL url = new URL("http://www.example.com/data"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setRequestMethod("GET"); conn.connect(); InputStream in = conn.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(in)); StringBuilder sb = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { sb.append(line); } result = sb.toString(); reader.close(); in.close(); conn.disconnect(); } catch (Exception e) { e.printStackTrace(); } return result; } @Override protected void onPostExecute(String result) { // 在 UI 线程中更新界面 textView.setText(result); } } // 在主线程中执行任务 new MyTask().execute(); ``` 在上面的示例代码中,`doInBackground()` 方法中执行网络请求,`onPostExecute()` 方法中更新界面。通过 `execute()` 方法启动异步任务,在后台线程中执行网络请求,然后在 UI 线程中更新界面。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值