Android中Thread,Handler,serivce中使用Thread和IntentService

发布于:2022-07-26 ⋅ 阅读:(487) ⋅ 点赞:(0)

1.Thread

        Android中有三种开启Thread的方式

                1.继承Thread

class MyTherad extends Thread{
    @Override
    public void run() {
        super.run();
        //耗时操作
        try {
            sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        //子线程内一旦有耗时操作就,就不能在子线程内进行UI修改
        String a="123";
        Log.i("接收到的值",a);

    }
}
//开启线程
MyTherad myTherad=new MyTherad();
myTherad.start();

                2.实现Runnable接口

class MyRunnable implements Runnable{

    @Override
    public void run() {
        try {
            Thread.sleep(3000);
            Log.i("实现接口创建子线程","123");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
MyRunnable myRunnable=new MyRunnable();
Thread thread=new Thread(myRunnable);
thread.start();

                3.Thread和Runnable综合使用(最常见的)

                        

new Thread(new Runnable() {
    @Override
    public void run() {
        try {
            Thread.sleep(3000);
            Log.i("匿名","333");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}).start();

2.Handler

1.特点

 从服务器接收到用户的昵称,并将昵称设置在textview对应的text属性上

 连接服务器的功能,是属于耗时任务,所以必须放在子线程

 子线程中是没有办法修改页面,借助Handler给主线程传递消息

 主线程接收到消息后,开始执行修改UI

 2.代码实现

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main2);

    tv_age = findViewById(R.id.tv_age);

    new Thread(new Runnable() {
        @Override
        public void run() {

            try {
                //模拟在连接服务器的耗时
                Thread.sleep(3000);


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

            Message message=new Message();
            message.what=1;
            message.obj=ac;
            handler.sendMessage(message);
        }
    }).start();
}
private Handler handler=new Handler(Looper.getMainLooper()){
    @Override
    public void handleMessage(@NonNull Message msg) {
        super.handleMessage(msg);
        if (msg.what==1){
            tv_age.setText(ac);
        }
    }
};

 3. 给Handler传值有两种方式 

1.new Message这种方式

Message message=new Message();

message.what=1;

message.obj=ac;

handler.sendMessage(message);

2.通过handler.hasMessages()这种方式

       

3.通过学习了以上知识做了一个进度条案例

       代码实现

                

public class MainActivity3 extends AppCompatActivity {
    private ProgressBar progressBar;
    private int aa=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() {
                try {
                    while (aa<100){
                        Thread.sleep(100);
                        aa++;
                        handler.hasMessages(1);
                    }
                } 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==1){
                progressBar.setProgress(aa);
            }
        }
    };
}

4.Seriver中使用Handler

1.特点

        Seriver中不会自动开启线程,也不会自动停止线程

2. 代码实现

                

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

    @Override
    public void onCreate() {
        Log.i("onCreate","服务已创建");
        super.onCreate();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.i("onCreate","服务已开启");
        new Thread(new Runnable() {
            @Override
            public void run() {
                long ac=System.currentTimeMillis()+20*1000;
                while (System.currentTimeMillis()<ac){
                    synchronized (this){
                        try {
                            wait(ac-System.currentTimeMillis());
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
                stopSelf();
            }
        }).start();

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

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

    @Override
    public IBinder onBind(Intent intent) {
        // TODO: Return the communication channel to the service.
        throw new UnsupportedOperationException("Not yet implemented");
    }
}

5.IntentService

       1.如何创建IntentService

                1.new 一个Java文件

                2.继承IntentService

                3.实现onHandleIntent方法和构造方法

                4.创建一个无参的构造方法

                5.注册

        2.特点

                IntentService 自动开启线程,并在执行完毕后,关闭线程

        3.代码实现

                

public class MyIntentService extends IntentService {
    /**
     * @param name
     * @deprecated
     */
    public MyIntentService(String name) {
        super(name);
    }
    public MyIntentService(){
        super("MyIntentService");

    }

    @Override
    protected void onHandleIntent(@Nullable Intent intent) {
        Log.i("IntentSerivce","IntentSerivce已启动");
        long ac=System.currentTimeMillis()+20*1000;
        while (System.currentTimeMillis()<ac){
            synchronized (this){
                try {
                    wait(ac-System.currentTimeMillis());
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    @Override
    public void onDestroy() {
        Log.i("IntentSerivce","IntentSerivce已销毁");
        super.onDestroy();
    }
}

                

        

                

                

                       

                                


网站公告

今日签到

点亮在社区的每一天
去签到