精华内容
下载资源
问答
  • Anroid子线程 handler 实现倒计时的功能
  • 子线程Handler sendMessage 报错 Attempt to invoke virtual method '

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

    也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

                    03-17 08:10:18.760 16029-16029/tech.androidstudio.tulingdemo E/AndroidRuntime: FATAL EXCEPTION: main
    03-17 08:10:18.760 16029-16029/tech.androidstudio.tulingdemo E/AndroidRuntime: Process: tech.androidstudio.tulingdemo, PID: 16029
    03-17 08:10:18.760 16029-16029/tech.androidstudio.tulingdemo E/AndroidRuntime: java.lang.IllegalStateException: Could not execute method for android:onClick
    03-17 08:10:18.760 16029-16029/tech.androidstudio.tulingdemo E/AndroidRuntime:     at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:275)
    03-17 08:10:18.760 16029-16029/tech.androidstudio.tulingdemo E/AndroidRuntime:     at android.view.View.performClick(View.java:4761)
    03-17 08:10:18.760 16029-16029/tech.androidstudio.tulingdemo E/AndroidRuntime:     at android.view.View$PerformClick.run(View.java:19767)
    03-17 08:10:18.760 16029-16029/tech.androidstudio.tulingdemo E/AndroidRuntime:     at android.os.Handler.handleCallback(Handler.java:739)
    03-17 08:10:18.760 16029-16029/tech.androidstudio.tulingdemo E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:95)
    03-17 08:10:18.760 16029-16029/tech.androidstudio.tulingdemo E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:135)
    03-17 08:10:18.760 16029-16029/tech.androidstudio.tulingdemo E/AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:5310)
    03-17 08:10:18.760 16029-16029/tech.androidstudio.tulingdemo E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Native Method)
    03-17 08:10:18.760 16029-16029/tech.androidstudio.tulingdemo E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Method.java:372)
    03-17 08:10:18.760 16029-16029/tech.androidstudio.tulingdemo E/AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901)
    03-17 08:10:18.760 16029-16029/tech.androidstudio.tulingdemo E/AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696)
    03-17 08:10:18.760 16029-16029/tech.androidstudio.tulingdemo E/AndroidRuntime:  Caused by: java.lang.reflect.InvocationTargetException
    03-17 08:10:18.760 16029-16029/tech.androidstudio.tulingdemo E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Native Method)
    03-17 08:10:18.760 16029-16029/tech.androidstudio.tulingdemo E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Method.java:372)
    03-17 08:10:18.760 16029-16029/tech.androidstudio.tulingdemo E/AndroidRuntime:     at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:270)
    03-17 08:10:18.760 16029-16029/tech.androidstudio.tulingdemo E/AndroidRuntime:     at android.view.View.performClick(View.java:4761) 
    03-17 08:10:18.760 16029-16029/tech.androidstudio.tulingdemo E/AndroidRuntime:     at android.view.View$PerformClick.run(View.java:19767) 
    03-17 08:10:18.760 16029-16029/tech.androidstudio.tulingdemo E/AndroidRuntime:     at android.os.Handler.handleCallback(Handler.java:739) 
    03-17 08:10:18.760 16029-16029/tech.androidstudio.tulingdemo E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:95) 
    03-17 08:10:18.760 16029-16029/tech.androidstudio.tulingdemo E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:135) 
    03-17 08:10:18.760 16029-16029/tech.androidstudio.tulingdemo E/AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:5310) 
    03-17 08:10:18.760 16029-16029/tech.androidstudio.tulingdemo E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Native Method) 
    03-17 08:10:18.760 16029-16029/tech.androidstudio.tulingdemo E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Method.java:372) 
    03-17 08:10:18.760 16029-16029/tech.androidstudio.tulingdemo E/AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901) 
    03-17 08:10:18.760 16029-16029/tech.androidstudio.tulingdemo E/AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696) 
    03-17 08:10:18.760 16029-16029/tech.androidstudio.tulingdemo E/AndroidRuntime:  Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'boolean android.os.Handler.sendMessage(android.os.Message)' on a null object reference
    03-17 08:10:18.760 16029-16029/tech.androidstudio.tulingdemo E/AndroidRuntime:     at tech.androidstudio.tulingdemo.MainActivity.btnSendMessage(MainActivity.java:65)
    03-17 08:10:18.760 16029-16029/tech.androidstudio.tulingdemo E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Native Method) 
    03-17 08:10:18.760 16029-16029/tech.androidstudio.tulingdemo E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Method.java:372) 
    03-17 08:10:18.760 16029-16029/tech.androidstudio.tulingdemo E/AndroidRuntime:     at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:270) 
    03-17 08:10:18.760 16029-16029/tech.androidstudio.tulingdemo E/AndroidRuntime:     at android.view.View.performClick(View.java:4761) 
    03-17 08:10:18.760 16029-16029/tech.androidstudio.tulingdemo E/AndroidRuntime:     at android.view.View$PerformClick.run(View.java:19767) 
    03-17 08:10:18.760 16029-16029/tech.androidstudio.tulingdemo E/AndroidRuntime:     at android.os.Handler.handleCallback(Handler.java:739) 
    03-17 08:10:18.760 16029-16029/tech.androidstudio.tulingdemo E/AndroidRuntime:     at android.os.Handler.dispatchMessage(Handler.java:95) 
    03-17 08:10:18.760 16029-16029/tech.androidstudio.tulingdemo E/AndroidRuntime:     at android.os.Looper.loop(Looper.java:135) 
    03-17 08:10:18.760 16029-16029/tech.androidstudio.tulingdemo E/AndroidRuntime:     at android.app.ActivityThread.main(ActivityThread.java:5310) 
    03-17 08:10:18.760 16029-16029/tech.androidstudio.tulingdemo E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Native Method) 
    03-17 08:10:18.760 16029-16029/tech.androidstudio.tulingdemo E/AndroidRuntime:     at java.lang.reflect.Method.invoke(Method.java:372) 
    03-17 08:10:18.760 16029-16029/tech.androidstudio.tulingdemo E/AndroidRuntime:     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:901) 

    03-17 08:10:18.760 16029-16029/tech.androidstudio.tulingdemo E/AndroidRuntime:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:696) 


    原因分析 :

     子线程handler 报错,是因为没有启动子线程就开始使用了。


    解决办法:

    在onCreate方法中启动Thread,千万别忘了Thread里面的this 参数,不然还会报错。

    Thread thread = new Thread(this);        thread.start();


    public class MainActivity extends AppCompatActivity implements Runnable {private EditText mEditText;    private ListView mListView;    private List<String> mData;    private ListViewAdapter mAdapter;    private Handler subHandler;    private Handler mainHandler;    private final int MAIN_HANDLER_ADD=98;    private final int SUB_HANDLER_ADD=998;    private final int SUB_HANDLER_EXIT=199;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        mEditText=(EditText)findViewById(R.id.editText);        mListView=(ListView)findViewById(R.id.listView);        mData = new ArrayList<>();        mAdapter = new ListViewAdapter(mData,this);        mListView.setAdapter(mAdapter);        mainHandler = new Handler(){            @Override            public void handleMessage(Message msg) {                super.handleMessage(msg);                int what = msg.what;                switch (what){                    case MAIN_HANDLER_ADD:                        String msg_reply = (String)msg.obj;                        mData.add(msg_reply);                        mAdapter.notifyDataSetChanged();                        break;                }            }        };        //千万别忘了启动子线程,不然会报错        //Attempt to invoke virtual method 'boolean android.os.Handler.sendMessage(android.os.Message)' on a null object reference        Thread thread = new Thread(this);        thread.start();    }    public void btnSendMessage(View view) {        String message_send = mEditText.getText().toString();        if(message_send!=null){            mData.add(message_send);            mAdapter.notifyDataSetChanged();            //将要发送的消息发送给子线程,(给子线程的handler),因为耗时操作不能在主线程进行            // 然后子线程请求数据再返回给主线程(主线程的 handler),因为 子线程不能修改界面的UI            Message message = Message.obtain();            message.what=SUB_HANDLER_ADD;            message.obj=message_send;            subHandler.sendMessage(message);//之前报错的位置是这一步        }    }    @Override    public void run() {        //绑定 当前线程的Looper        Looper.prepare();            subHandler= new Handler(){                @Override                public void handleMessage(Message msg) {                    super.handleMessage(msg);                    int what = msg.what;                    switch (what){                        case SUB_HANDLER_ADD:                            //获取发送的消息,然后通过HttpUtils来发送,并且得到返回值,                            //把这个返回值 再给主线程的 handler来处理。                            //先写一个模拟数据 ,例如"收到了"发送给主线程。                            Message message = Message.obtain();                            message.what=MAIN_HANDLER_ADD;                            message.obj="收到了";                            mainHandler.sendMessage(message);                            break;                        case SUB_HANDLER_EXIT:                            //onDestroy里面停止这个Looper                            Looper looper = Looper.myLooper();                            looper.quit();                            break;                    }                }            };        //不停的循环 ,就像是while一样。        Looper.loop();    }}

               

    给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow

    这里写图片描述
    展开全文
  • public class FinalActivity extends AppCompatActivity { private TextView tvFinal;... private static Handler h; @Override protected void onCreate(Bundle savedInstanceState) { supe...
    public class FinalActivity extends AppCompatActivity {
    
        private TextView tvFinal;
        private static Handler h;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_final);
            findViewById(R.id.btn_next).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    LogUtils.w("click............");
                    h.sendEmptyMessage(1);
                }
            });
            tvFinal = findViewById(R.id.final_tv);
    
            new Thread(new Runnable() {
                @SuppressLint("HandlerLeak")
                @Override
                public void run() {
                    Looper.prepare();
                    h = new Handler(Looper.myLooper()) {
                        @Override
                        public void handleMessage(Message msg) {
                            super.handleMessage(msg);
                            String text = "改变了" + new Random().nextInt(1000);
                            LogUtils.w("text:" + text);
    
                        }
                    };
                    Looper.loop();
                }
            }).start();
        }
    
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            LogUtils.w("destroy....");
            if (h != null) {
                h.removeCallbacksAndMessages(null);
            }
        }
    }

    代码是示例代码,但是简单明了,子线程更新 UI,就这样写就可以了。

    展开全文
  • 一般情况下在子线程中创建Handler如下: Handler handler; //创建全局变量 Thread mThread = new Thread(new Runnable() { public void run() { Looper.prepare(); handler = new
    一般情况下在子线程中创建Handler如下:
    	 Handler handler; //创建全局变量
    	 Thread mThread = new Thread(new Runnable() {  
    	           public void run() {  
    	               Looper.prepare();  
    	               handler = new Handler(){  
    	                   @Override  
    	                   public void handleMessage(Message msg) {  
    	                       Toast.makeText(getApplicationContext(), "处理事件", Toast.LENGTH_LONG).show();  
    	                   }  
    	               };  
    	               Looper.loop();  
    	            };  
    	});
    	mThread.start();
    //通过handler即可进行消息发送
    	handler.sendEmptyMessage(0);
    
    通过handlerThread创建子线程与handler:
    	Handler mHandler;//创建全局变量
    	HandlerThread mHandlerThread = new HandlerThread("thread_name");
            mHandlerThread.start();
            mHandler = new Handler(mHandlerThread.getLooper()) {
                @Override
                public void handleMessage(Message msg)
                {
                	Toast.makeText(getApplicationContext(), "HandlerThread 处理事件", Toast.LENGTH_LONG).show();
                }
            };
    通过mHandler即可进行消息发送
    	mHandler.sendEmptyMessage(0);
    
        二者都是通过创建开启一个子线程来处理耗时操作,但是通过HandlerThread开启一个线程起到多个线程的作用。处理任务是串行执行,按消息发送顺序进行处理。
      HandlerThread本质是一个线程,在线程内部,代码是串行处理的。但是由于每一个任务都将以队列的方式逐个被执行到,一旦队列中有某个任务执行时间过长,那么就会导致后续的任务都会被延迟处理。HandlerThread拥有自己的消息队列,它不会干扰或阻塞UI线程。
    
    查看HandlerThread的源码:
    创建Looper是在子线程的run方法中,但是我们在new Handler(mHandlerThread.getLooper())时调用getLooper()是在主线程中,为了解决线程不同步问题,HandlerThread内部则通过等待唤醒机制解决了此问题,关键代码如下:
    run方法中:
    synchronized (this) {
        mLooper = Looper.myLooper();
        notifyAll();//唤醒等待线程
    }
    
    public Looper getLooper() {
     //先判断当前线程是否启动
       if (!isAlive()) {
           return null;
       }
       // If the thread has been started, wait until the looper has been created.
       synchronized (this) {
           while (isAlive() && mLooper == null) {
               try {
                   wait();//等待唤醒
               } catch (InterruptedException e) {
               }
           }
       }
       return mLooper;
    }
    

    展开全文
  • 子线程Handler抛出异常

    2019-03-05 16:34:09
    先看一段代码 ... Handler handler=null; public void run(){ handler =new Handler(); }; }.start(); 运行之后会抛出Can't create handler inside thread that has not called Looper.prepare...

    先看一段代码

    new Thread(){
        Handler handler=null;
        public void run(){
            handler =new Handler();
        };
    }.start();

    运行之后会抛出 Can't create handler inside thread that has not called Looper.prepare()

    我们来看源码

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

    }

    当mLooper为空时,抛出了异常,因为该线程中的Looper还没有创建

    所以我们再构造Handler之前,为当前线程设置Looper对象如下

    new Thread(){
        Handler handler=null;
        public void run(){
            Looper.prepare();
            handler =new Handler();
            Looper.loop();
        };
    }.start();

    Looper.prepare();来创建Looper,创建了Looper也就是有了自己的消息队列,但是我们还需执行Looper.loop();启动消息循环,这样才能被执行

    展开全文
  • android子线程handler获取数据

    千次阅读 2016-02-22 15:28:18
    今天和大家分享下android 获取接口时,开通子线程进行异步获取数据。 我这边选用的是handler机制。在handler有多种获取方法。今天介绍的是一种比较流行,效率较高的一种方法:...private Handler handler = new
  • ),因为 子线程不能修改界面的 UI Message message = Message. obtain (); message. what = SUB_HANDLER_ADD ; message. obj =message_send; subHandler .sendMessage(message); //之前报错的位置是这一步 ...
  • 上一篇博客介绍了Android异步消息处理机制,如果你还不了解,可以看:Android 异步消息处理机制 让你深入理解 Looper、Handler、Message三者关系 。那篇博客的最后,提出可以把异步消息处理机制不仅仅是在...
  • Android 子线程子线程通过Handler通信1、创建发送消息的子线程2、创建接收消息的子线程3、编辑主函数4、编写布局文件5、运行并观察结果 1、创建发送消息的子线程 创建一个Thread1类 import android.os.Handler; ...
  • 子线程创建Handler

    2017-07-12 15:20:18
    朋友跳槽,面试时被问到子线程可以创建Handler吗?对于这个问题,其实我也是有点疑惑,暂且不论子线程创建Handler的应用场景,对于能不能创建这个事情我还是比较好奇的,作为一名爱较真的程序猿,马上打开Android...
  • Android Handler(二)子线程子线程通信

    千次阅读 2018-06-22 17:53:19
    Android Handler(二)子线程子线程通信 子线程和子线程间通过Handler通信 发送消息的子线程 package com.cdc.handler; import android.os.Handler; import android.os.Message; import android.os.System...
  • 309_子线程创建Handler

    2016-10-12 21:15:24
    子线程创建Handler 这篇是看郭霖大神博客写的 相当于读书笔记而已 博客地址是:http://blog.csdn.net/guolin_blog/article/details/9991569 一.子线程中不能创建Handler  new Thread(new ...
  • 主线处理handler,大家都比较熟悉了,就是通过在onCreat中,new Handler  handler = new Handler(new Handler.Callback() { @Override public boolean handleMessage(Message msg) { System.out.println(...
  • 子线程不能直接跟新UI !!!所以用Handler通知主线程去更新UI 第一步: 在子线程中向主线程传递数据 //通过handler传递数据到主线程 Message msg = new Message(); msg.obj = 0; handler.sendMessage(msg); 第二...
  • Handler消息传递详解,子线程到子线程,主线程到子线程,子线程到主线程 三种消息,Looper,Handler工作机制详解 https://blog.csdn.net/shoneworn/article/details/80447651
  • Android 子线程创建handler

    千次阅读 2017-12-24 22:55:05
    据上篇我转载的 Handler,Looper, Message 三者关系深入消化,理解后。我们会很清楚地使用了子线程和Ui线程通信的问题。 即解决了一个网络请求成功或者失败后,通知ui线程更新界面的case。 但是有人会疑问,那子线程...
  • android 子线程使用handler通信

    千次阅读 2019-03-28 11:11:27
    我们日常使用处理线程间的通信是 主线与子线程之间相互通信,也就是使用android提供的handler。 那么子线程之间如何相互通信呢?一般有可能会使用 全局变量来进行通信,其实我们也可以使用系统提供的handler来...
  • 关键字:Android 使用handler实现线程间发送消息 (主线程 与 子线程之间)、(子线程子线程之间) 相信大家平时都有使用到异步线程往主线程(UI线程)发送消息的情况。本文主要研究Handler的消息发送。包括...
  • 子线程中获取了网络接口,然后传给了HandlerHandler里解析Json,获得的Json中有图片网络地址,怎样在Handler中取网络图片,求大神指点迷津!!!感激不尽
  • 主线程和子线程和HandlerThread 子线程间的通信
  • 一些耗时的工作,不可以让主线程去处理,所以得开一个子线程,比如联网通信,但是子线程不能更新UI,所以用到Handler Handler 用法:在子线程中把数据发送出去public void run() { Message message = new Message();...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,515
精华内容 1,006
关键字:

子线程handler