移动应用开发 实验报告14 线程的使用
一、实验目的 掌握线程创建的方法; 熟悉Thread类及Runnable接口。
|
二、实验内容 1.创建按钮,点击后创建线程,实现打印循环变量的任务。 2.创建按钮,点击后销毁线程。 3.在窗口销毁方法中实现窗口销毁时自动销毁线程的功能。
|
三、实验原理 在安卓程序开发时,对于一些比较耗时的操作,通常会开启一个单独的线程来执行,可以尽可能减少用户等待时间。在安卓程序中,默认情况下,所有的操作都是在主线程中进行的,这个主线程负责管理与UI相关事件。而在我们自己创建的子线程中,不能对UI组件进行操作,因此,Android提供了消息处理传递机制来解决这一问题。 |
四、实验代码及结果 package com.example.luz0;
import android.os.Bundle; import android.app.Activity; import android.util.Log; import android.view.View; import android.view.Menu; import android.view.View.OnClickListener; import android.widget.Button;
public class MainActivity extends Activity implements Runnable { private Thread thread; int i;
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button startButton=(Button)findViewById(R.id.button1); startButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { i=0; thread=new Thread(MainActivity.this); thread.start(); } }); Button stopButton=(Button)findViewById(R.id.button2); stopButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if(thread!=null) { thread.interrupt(); thread=null; } Log.i("提示:","中断线程"); } }); } @Override protected void onDestroy() { if(thread!=null) { thread.interrupt(); thread=null; } Log.i("提示:","中断线程"); super.onDestroy(); }
@Override public void run() { while(!Thread.currentThread().isInterrupted()) { i++; Log.i("循环变量:",String.valueOf(i)); } }
@Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; }
}
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" >
<Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Start" />
<Button android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Stop" />
</LinearLayout>
|
五、试验分析(思考) UI Thread中运行着许多重要的逻辑,如系统事件处理,用户输入事件处理,UI绘制,Service,Alarm等而我们编写的代码则是穿插在这些逻辑中间,比如对用户触摸事件的检测和响应,对用户输入的处理,自定义View的绘制等。如果我们插入的代码比价耗时,如网络请求或数据库读取,就会阻塞UI线程其他逻辑的执行,从而导致界面卡顿。如果卡顿时间超过5秒,系统就会报ANR错误。所以,如果要执行耗时的操作,我们需要另起线程执行。 启用debug时,如果在程序界面加载前开启了debug,则似乎会自动在窗口加载事件前添加断点,因此可以先运行程序,再使用debug调试.
|