android中的线程使用

2 篇文章 0 订阅
1 篇文章 0 订阅

目录

1.线程

1.1.继承Thread

1.2.实现Runnable接口

1.3.匿名类

2.更新

2.1.通过runOnUiThread

2.2.handler

2.3.view.post()

2.4.handler.post()

2.5.AsyncTask


android中的线程使用

1.线程

1.1.继承Thread

class MyThread extends Thread {
        @Override
        public void run() {
            //子线程
            Log.d("TAG", "开启了线程");
        }
    }

启动:

new MyThread().start();

1.2.实现Runnable接口

使用继承耦合有些高,更过的时候我们使用实现Runnable接口的方式

  class MyThread1 implements Runnable {
        @Override
        public void run() {
            //子线程
            Log.d("TAG", "开启了线程1");
          
        }
    }

启动:

MyThread1 mythread1 = new MyThread1();
new Thread(mythread1).start();

1.3.匿名类

如果不想要去实现Runnabe接口也可以使用匿名内部类

 //使用匿名类Runnable
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        //子线程
                     
                    }
                }).start();

 

以上三种就是android中常用多线程的用法。

因为android子线中不允许更新UI ,更新UI会报错:

  android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
        at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:6357)

这时候需要从主线程更新:

2.更新

2.1.通过runOnUiThread

runOnUiThread(new Runnable() {
    @Override
    public void run() {
        textView.setText("MyThread1");
    }

2.2.handler

public static final int TAG = 1;
private Handler handler = new Handler() {
    @Override
    public void handleMessage(@NonNull Message msg) {
        super.handleMessage(msg);
        switch (msg.what) {
            case TAG:
                textView.setText("匿名内部类");
                break;
        }
    }
};
Message message = new Message();
message.what = TAG;
handler.sendMessage(message);

2.3.view.post()

textView.post(new Runnable() {
    @Override
    public void run() {
        textView.setText("MyThread");
    }
});

2.4.handler.post()

handler.post(new Runnable() {
    @Override
    public void run() {
        textView.setText("MyThread");
    }
});

2.5.AsyncTask

https://blog.csdn.net/qq_35698774/article/details/107394945

完整代码:

package com.example.mythred;

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

import android.media.ImageReader;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    private TextView textView;
    public static final int TAG = 1;
    private Handler handler = new Handler() {
        @Override
        public void handleMessage(@NonNull Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
                case TAG:
                    textView.setText("匿名内部类");
                    break;
            }
        }
    };


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = findViewById(R.id.tv);
        Button button = findViewById(R.id.button);
        Button button1 = findViewById(R.id.button1);
        Button button2 = findViewById(R.id.button2);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //开启MyThread线程
                new MyThread().start();
            }
        });
        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //开启Mythread线程
                MyThread1 mythread1 = new MyThread1();
                new Thread(mythread1).start();
            }
        });
        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //使用匿名类Runnable
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        //子线程
                        Log.d("TAG", "开启匿名内部类线程");
//                        textView.setText("匿名内部类");
                        Message message = new Message();
                        message.what = TAG;
                        handler.sendMessage(message);
                    }
                }).start();
            }
        });
    }


    class MyThread extends Thread {
        @Override
        public void run() {
            //子线程
            Log.d("TAG", "开启了线程");
//            textView.setText("MyThread");
            textView.post(new Runnable() {
                @Override
                public void run() {
                    textView.setText("MyThread");
                }
            });
            handler.post(new Runnable() {
                @Override
                public void run() {
                    textView.setText("MyThread");
                }
            });
        }
    }

    class MyThread1 implements Runnable {
        @Override
        public void run() {
            //子线程
            Log.d("TAG", "开启了线程1");
//            textView.setText("MyThread1");
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    textView.setText("MyThread1");
                }
            });
        }
    }
}

转发表明出处https://blog.csdn.net/qq_35698774/article/details/107371829

点击下载

android互助群:

 

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大不懂

码字不易,一块也是爱,么么

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值