工作线程弹toast

创建Handler的线程必须有looper。

    public Handler(Callback callback, boolean async) {
        if (FIND_POTENTIAL_LEAKS) {
            final Class<? extends Handler> klass = getClass();
            if ((klass.isAnonymousClass() || klass.isMemberClass() || klass.isLocalClass()) &&
                    (klass.getModifiers() & Modifier.STATIC) == 0) {
                Log.w(TAG, "The following Handler class should be static or leaks might occur: " +
                    klass.getCanonicalName());
            }
        }

        mLooper = Looper.myLooper();
        if (mLooper == null) {
            throw new RuntimeException(
                "Can't create handler inside thread that has not called Looper.prepare()");
        }
        mQueue = mLooper.mQueue;
        mCallback = callback;
        mAsynchronous = async;
    }

looper = null 时,Handler构造器抛出异常。

再没有looper的工作线程中使用toast

public class ToastActivity extends AppCompatActivity implements View.OnClickListener {

    private View mBtn1;

    private Thread mThread = new MyThread();

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

        mBtn1 = findViewById(R.id.toast);
        mBtn1.setOnClickListener(this);

    }

    @Override
    public void onClick(View v) {
        mThread.start();
    }

    public void logs(String text) {
        android.util.Log.i("jue","HandlerThreadActivity -> " + text);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
    }

    public class MyThread extends Thread {
        @Override
        public void run() {

            Toast.makeText(ToastActivity.this, "MyThread toast", Toast.LENGTH_SHORT).show();
        }
    }
}

发生了异常


给工作线程添加looper之后。

package com.jue.testservice1;

import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Toast;

/**
 * Created by jue on 2016/11/18.
 */

public class ToastActivity extends AppCompatActivity implements View.OnClickListener {

    private View mBtn1;
    
    private WorkingThreadHandler mHander;

    private Thread mThread = new MyThread();

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

        mBtn1 = findViewById(R.id.toast);
        mBtn1.setOnClickListener(this);


        mThread.start();

    }

    @Override
    public void onClick(View v) {
        mHander.sendEmptyMessage(100);
    }

    public void logs(String text) {
        android.util.Log.i("jue","HandlerThreadActivity -> " + text);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
    }

    public class MyThread extends Thread {
        @Override
        public void run() {

            Looper.prepare();
            Looper looper = Looper.myLooper();
            mHander = new WorkingThreadHandler(looper);
            Looper.loop();
            
        }
    }
    
    public class WorkingThreadHandler extends Handler {
        public WorkingThreadHandler(Looper looper) {
            super(looper);
        }

        @Override
        public void handleMessage(Message msg) {
            Toast.makeText(ToastActivity.this, "Working Thread toast", Toast.LENGTH_SHORT).show();
        }
    }
}

可以正常弹出toast。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值