栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Thread(线程),handler 句柄,IntentService ,handlerThread

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Thread(线程),handler 句柄,IntentService ,handlerThread

Thread(线程)

Android 三种方式开启子线程

继承Thread
class MyThread extends Thread{
	public void run(){
		// 写耗时操作代码
		// Only the original thread that created a view hierarchy can touch its views.
		// 如果子线程已经执行了耗时操作,那么就不能修改视图的属性了;视图的属性只能在UI线程去修改
	}
}

MyThread myThead = new MyThread();
myThread.start();
实现Runnable接口
class MyRunnable implements Runnable {
	@Override
	public void run() {
		try {
			Thread.sleep(3000);

			String result = "runnable 345345";
			Log.i("runnable", result);

		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}

MyRunnable myRunnable = new MyRunnable();
Thread thread = new Thread(myRunnable);
thread.start();
Thread和Runnable结合
new Thread(new Runnable() {
	@Override
    public void run() {
    	// 耗时任务
		try {
			Thread.sleep(3000);
			String result = "匿名线程";
			Log.i("匿名线程",result);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}).start();
Handler

将子线程中的消息传递给主线程。例如:更新UI时使用Handler

定义handler
private Handler handler = new Handler(Looper.getMainLooper()){
			
}; 
将子线程中的消息传递给主线程
方式一:
Message msg = new Messag();
msg.what = 1;
msg.obj = "内容";
handler.sendMessage(msg);
方式二:
handler.sendEmptyMessage(0x111);
主线程的接受消息,并处理消息
private Handler handler = new Handler(Looper.getMainLooper()){
		
		handleMessage(Message msg) {
			if(msg.what == 1) {
				
			}
		}
}; 
主线程接收到消息并更新UI
private Handler handler = new Handler(Looper.getMainLooper()){
		
		handleMessage(Message msg) {
			if(msg.what == 1) {
				tv_show.setText("123");
			}
		}
};
拓展:Handler控制进度条
public class MainActivity3 extends AppCompatActivity {

    private ProgressBar progressBar;
    int status = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main3);

        progressBar = findViewById(R.id.progressBar);

        new Thread(new Runnable() {
            @Override
            public void run() {
                // 循环对status进行值得修改
                while (status < 100) {
                    try {
                        Thread.sleep(100);
                        status++;
                        handler.sendEmptyMessage(0x111);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                }
            }
        }).start();
    }

    private Handler handler = new Handler(Looper.getMainLooper()) {
        @Override
        public void handleMessage(@NonNull Message msg) {
            super.handleMessage(msg);
            if (msg.what == 0x111) {
                progressBar.setProgress(status);
            }
        }
    };
}
Service制造ANR 
package com.jzj.day32tage02;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;

public class MyService extends Service {
    public MyService() {
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Log.i("service","服务启动");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.i("service","服务开启");
                long endtime = System.currentTimeMillis() + 20 * 1000;
                while (System.currentTimeMillis() < endtime){
                    synchronized (this){
                        try {
                            wait(endtime - System.currentTimeMillis());
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }

        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.i("service","服务销毁");
    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        throw new UnsupportedOperationException("Not yet implemented");
    }
}
Service解决ANR 
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
	Log.i("serivce","服务已开启");

	new Thread(new Runnable() {
        @Override
        public void run() {
        long endtime = System.currentTimeMillis() + 20 * 1000;  // 获取当前系统再加上20秒
            while(System.currentTimeMillis() < endtime) {
                synchronized (this){
                    try {
                        wait(endtime - System.currentTimeMillis());
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }

            }
            stopSelf();
		}
	}).start();

return super.onStartCommand(intent, flags, startId);
}
IntentService

如何创建一个IntentService

new Class-> MyIntentService ->继承IntentService->实现onHandleIntent 和 构造方法

在AndroidManifest.xml中注册,注册时发现报错,报错的原因是没有无参的构造方法,解决办法:创建无参的构造方法  IntentService 会自动开启线程,并在执行完毕后,关闭线程

package com.jzj.day32tage02;

import android.app.IntentService;
import android.content.Intent;
import android.util.Log;

import androidx.annotation.Nullable;

public class MyIntentService extends IntentService{
    public MyIntentService() {
        super("MyIntentService");
    }
    
    public MyIntentService(String name) {
        super(name);
    }

    @Override
    protected void onHandleIntent(@Nullable Intent intent) {
        Log.i("IntentService","服务开启");

        long edintime = System.currentTimeMillis() + 20 * 1000;
        while (System.currentTimeMillis() < edintime){
            synchronized (this){
                try {
                    wait(edintime - System.currentTimeMillis());
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.i("IntentService","服务销毁");
    }
}
handlerThread

 

  1. 如图创建页面效果
  2. 当用户点击开始计数按钮时,输入框值每1000毫秒增加1
  3. 当用户点击停止计数按钮时,停止计数
package com.jzj.day32homework;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

public class MainActivity4 extends AppCompatActivity {
    private Button but_01;
    private Button but_02;
    private EditText editText;
    private HandlerThread mhandlerThread;
    private Handler threadHandler;
    private Handler mHandler = new Handler();
    private boolean isRun = true;
    int i = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main4);
        but_01 = findViewById(R.id.button);
        but_02 = findViewById(R.id.button2);
        editText = findViewById(R.id.et_1);
        but_01.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                isRun = true;
                threadHandler.sendEmptyMessage(0x111);
            }
        });
        but_02.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                isRun = false;
                threadHandler.sendEmptyMessage(0x111);
            }
        });
        mhandlerThread = new HandlerThread("hand");
        mhandlerThread.start();
                threadHandler = new Handler(mhandlerThread.getLooper()){
                    @Override
                    public void handleMessage(@NonNull Message msg) {
                        try {
                            Thread.sleep(500);
                            i = Integer.parseInt(editText.getText().toString());
                            i+=1;
                            if(isRun)
                            threadHandler.sendEmptyMessage(0x111);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        mHandler.post(new Runnable() {
                            @Override
                            public void run() {
                                editText.setText(i+"");
                            }
                        });
                    }
                };
            }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        mhandlerThread.quit();
    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1028473.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号