实验四:多线程应用
一、 实验目的
1. 掌握多线程的基本概念
2. 掌握Handler类的基本用法
3. 掌握AsyncTask类的基本用法
4. 掌握多线程综合应用
二、 实验内容
启动应用先显示一个图片“正在获取网络图片“,开启新线程从网络下载图片,下载完毕替换“正在获取网络图片”;单击“查看更多”按钮,在打开新界面中使用多线程从本地资源中随机选取图片进行切换显示。完成后的效果如图所示。
三、 理论
多线程经常用于游戏、多媒体程序、有网络连接的程序、进行耗时计算等的程序中。Android
使用Thread类创建线程,并提供用于发送消息和处理消息的类Handler。在后台工作比较简单、只需要向UI线程传递一些简 单数据的环境下,Android 还提供了AsyncTask 类,AsyncTask 是Android提供的一个轻量级的基于多线程的进行后台异步工作处理的类,另外,Timer定时器也是常用的实现多线程程序的方式。
四、 设计步骤
(1) 创建Android项目,修改布局文件如下所示,请将下列空出代码补全。
(2) 主Activity类MainActivity. Java,代码如下所示
(3) 修改布局文件activity_thread.xml,请将下列空出代码补全。
(4) 修改Activity类文件MyThread.java,代码如下所示。
(5) 在AndroidManifest.xml文件中增加网络访问许可,代码如下所示。
五、 效果图展示
根据实验内容的要求,把设计的每部分效果图进行展示,并对核心代码进行分析。(此处需要截图)
六、 实验总结
此处是对本次实验过程的总结(主要学习到了哪些知识,有什么心得体会等)。
七、 Tips
注意MyThread.java中的图片要自己设置啊,就是那个path数组。
还有AndroidManifest.xml文件中加上网络允许许可
这俩。
八、 代码
MainActivity.java
package com.example.test6;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
public class MainActivity extends AppCompatActivity {
private ImageView iv = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv = findViewById(R.id.iv);
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
final Bitmap bm = getPic("http://img0.pconline.com.cn/pconline/1303/11/3209483_25_500.jpg");
try {
Thread.sleep(2000);
}catch (Exception e){
e.printStackTrace();
}
//System.out.println("$$$$$$$$$$$$$$$$$$$$$$$$$$");
iv.post(new Runnable() {
@Override
public void run() {
iv.setImageBitmap(bm);
}
});
}
});
thread.start();
}
private Bitmap getPic(String path) {
Bitmap bm = null;
try {
URL url = new URL(path);
URLConnection urlConnection = url.openConnection();
urlConnection.connect();
InputStream is = urlConnection.getInputStream();
bm = BitmapFactory.decodeStream(is);
} catch (Exception e) {
e.printStackTrace();
}
return bm;
}
public void lookMore(View view) {
Intent intent = new Intent();
intent.setClass(this, MyThread.class);
startActivity(intent);
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="#fffae4"
tools:context=".MainActivity">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="产品介绍"
android:textSize="30dp"
/>
<ImageView
android:id="@+id/iv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:src="@drawable/hunter"
/>
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:onClick="lookMore"
android:text="查看更多"
/>
</LinearLayout>
MyThread.java
package com.example.test6;
import androidx.appcompat.app.AppCompatActivity;
import android.annotation.SuppressLint;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.ImageView;
import java.util.Random;
public class MyThread extends AppCompatActivity implements Runnable{
private ImageView iv = null;
private Handler handler = null;
private int[] path = {R.mipmap.ico1,R.mipmap.ico2,R.mipmap.ico3,R.mipmap.ico4,R.mipmap.ico5,R.mipmap.ico6};
private Thread t;
@SuppressLint("HandlerLeak")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_thread);
iv = (ImageView) findViewById(R.id.iv1);
t = new Thread(this);
t.start();
handler = new Handler() {
@Override
public void handleMessage(Message msg) {
if(msg.what==0x111) iv.setImageResource(path[msg.arg1]);
super.handleMessage(msg);
}
};
}
@Override
public void run() {
int index = 0;
while(!Thread.currentThread().isInterrupted()) {
index = new Random().nextInt(path.length);
Message msg = handler.obtainMessage();
msg.arg1 = index;
msg.what = 0x111;
handler.sendMessage(msg);
try {
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
}
}
@Override
protected void onDestroy() {
super.onDestroy();
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="#fffae4"
tools:context=".MyThread">
<ImageView
android:id="@+id/iv1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:layout_gravity="center"
/>
</LinearLayout>
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.INTERNET"/>
<application
android:usesCleartextTraffic="true"
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.Test6"
tools:targetApi="31">
<activity
android:name=".MyThread"
android:exported="false">
<meta-data
android:name="android.app.lib_name"
android:value="" />
</activity>
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<meta-data
android:name="android.app.lib_name"
android:value="" />
</activity>
</application>
</manifest>