-->
当前位置:首页 > 题库 > 正文内容

移动应用开发 实验报告14 线程的使用

Luz4年前 (2021-08-08)题库1106

一、实验目的

掌握线程创建的方法;

熟悉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调试.
 
 

 


发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。