首页 技术 正文
技术 2022年11月23日
0 收藏 693 点赞 2,503 浏览 2750 个字

1. 线程Thread

2. 异步任务AsyncTask

————————————————-

————————————————-

1. 线程Thread

在APK开启后,就会有一个主线程,负责与用户交互。如果在主线程中执行了耗时操作,那么界面就会停止响应,所以要将耗时操作转移到别的线程中

2. 异步任务AsyncTask

耗时任务不能再UI主线程中执行,异步任务使用AsyncTask

AsyncTask<String, Float, String>
       //第一个参数String代表传入参数
      //第二个参数Float代表 执行过程中的数值
      //第三个参数String 代表返回值

下面是一个读取网页操作的demo

① 布局文件: 点击button,将获取到的内容放在TextView中显示

<Button
android:id="@+id/btnRead"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/read_website" /><ScrollView
android:layout_width="fill_parent"
android:layout_height="wrap_content" > <TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
</ScrollView>

② 定义AsyncTask

在 doInBackground 中不能调用UI控件进行操作

对UI控件的操作必须在其他几个回调函数中执行:onCancelled,onCancelled(),onPostExecute, onPreExecute, onProgressUpdate

public void readUrl(String url) {
new AsyncTask<String, Float, String>() {
//第一个参数String代表传入参数
//第二个参数Float代表 执行过程中的数值
//第三个参数String 代表返回值
@Override
protected String doInBackground(String... params) {
// 在后台运行
try {
URL url = new URL(params[0]);
URLConnection conn = url.openConnection();
long total = conn.getContentLength(); // 要读取的内容总长度
InputStream is = conn.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr); String line;
StringBuilder builder = new StringBuilder();
while ((line = br.readLine()) != null) {
builder.append(line);
float values = builder.toString().length() / total;
publishProgress(values); // 对应onProgressUpdate, 对外发布进度
}
br.close();
isr.close();
is.close();
return builder.toString(); //对应onPostExecute
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
} @Override
protected void onCancelled() {
// TODO Auto-generated method stub
super.onCancelled();
} @Override
protected void onCancelled(String result) {
// TODO Auto-generated method stub
super.onCancelled(result);
} @Override
protected void onPostExecute(String result) {
// 当前的Async执行完毕后会回调它
tv1.setText(result);
super.onPostExecute(result);
} @Override
protected void onPreExecute() {
// 当前的Async执行完毕前会回调它
Toast.makeText(getApplicationContext(), "start Read",
Toast.LENGTH_SHORT).show();
super.onPreExecute();
} @Override
protected void onProgressUpdate(Float... values) {
// 在执行任务的过程中对外发布执行的进度
Log.d("CARLOZ", "values = " + values[0]);
super.onProgressUpdate(values);
} }.execute(url);
}

③ 调用AsyncTask

TextView tv1;@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv1 = (TextView) findViewById(R.id.textView1);
findViewById(R.id.btnRead).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
readUrl("http://carloz.duapp.com");
}
});
}

结果如下:

Android Thread和AsyncTask

相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:8,990
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,504
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,348
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,133
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,765
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,843