Android线程和handler

  根据视频仿照着写了个demo:

package com.wyl.wylthreadtest;

import android.graphics.Color;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.app.Fragment;
import android.support.v7.app.ActionBarActivity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends ActionBarActivity {
	TextView textView;
	Button button;
	Handler myhandler;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = (TextView)findViewById(R.id.textViewId);
        button = (Button)findViewById(R.id.buttonId);
        myhandler = new myHandler();

        buttonListener listener = new buttonListener();
        button.setOnClickListener(listener);
    }
    /**
     * 添加button的onclick监听器
     * @author Administrator
     *
     */
    class buttonListener implements OnClickListener{
    	@Override
    	public void onClick(View view) {
//    		textView.setText("我的女神");
//    		textView.setTextColor(Color.GRAY);
//    		System.out.println("buttonListener:"+Thread.currentThread().getName());

    		myThread mythread = new myThread();
    		System.out.println("buttonListener:"+Thread.currentThread().getName());
    		mythread.start();
//    		mythread.run();
    	}

    }
    /**
     * 实现自己的一个线程,模拟从网络上获取数据然后传给handler
     * @author Administrator
     *
     */
    class myThread extends Thread{
    	String name = "模拟从网络上获取数据然后传给handler";

    	@Override
    	public void run() {
    		try {
				sleep(1*1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
    		System.out.println("myThead 子线程"+Thread.currentThread().getName());

    		Message msg = myhandler.obtainMessage();
    		msg.obj = name;
    		myhandler.sendMessage(msg);
    	}

    }

    /**
     * handler继承Handler父类
     * @author Administrator
     *
     */
    class myHandler extends Handler{
    	@Override
    	public void handleMessage(Message msg) {
    		System.out.println("myHandler:"+Thread.currentThread().getName());
    		String name = (String)msg.obj;
    		textView.setText(name);
    	}

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {

        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

    /**
     * A placeholder fragment containing a simple view.
     */
    public static class PlaceholderFragment extends Fragment {

        public PlaceholderFragment() {
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.fragment_main, container, false);
            return rootView;
        }
    }

}

  效果图如下:

时间: 2024-12-19 17:02:30

Android线程和handler的相关文章

Android 线程问题 handler & synctask

在安卓应用中,很多耗时的工作不能放在主线程,即ui线程中进行,因为会导致线程堵塞,使得系统判断程序运行异常,所以,需要多线程来进行异步操作,Android中提供了两种多线程的实现方式,此处注意,只要涉及ui更新的都必须要在主线程中进行 1.Handler handler有两个重要的构造方式,一个是空参数的,一个是带有Looper的,用空参数的方式生成的handler是和当前的线程关联的,一般是主线程,另一种是也可以为它提供一个Looper,这样它就会绑定到Looper所在的线程上.Handler

Android:使用Handler在线程之间通信

概述 假设一个情景,在一个应用程序中,要完成一个比较复杂.耗时较长的计算任务,如果将这个任务直接在主线程中开始,那么用户界面就会停止对用户操作的响应,而去解决这个计算任务,直到任务完成. 显然,这不是我们想要的结果.那么就需要用到多线程来解决这个问题. 但是新的问题又出现了,在C#和Android中,子线程是不能直接修改用户界面的数据的.也就是说,子线程计算出的结果,不能直接在子线程中让它显示在用户界面上.那么就需要把数据首先传递给主线程,让主线程去修改用户界面. Handler就是为了解决这个

Android 线程更新UI报错 : Can't create handler inside thread that has not called Looper.prepare()

MainActivity中有一个按钮,绑定了save方法 public void save(View view) { String title = titleText.getText().toString(); String timelength = lengthText.getText().toString(); ExecutorService exec = Executors.newCachedThreadPool(); exec.execute(new NewsService(getApp

android线程通信之Handler

android中线程分为两种: 1)系统创建的用于处理UI界面和用户交互事件的主线程 2)自己创建的用于实现其他业务的子线程 UI中的控件是线程不安全的,只能在主线程中操作控件,不能在其他子线程中直接操作控件. 如果想在其他线程中操作主线程中的控件,只能通过发送一个消息告诉主线程去更新界面. 为了便于在线程间发送消息进行通信,android实现了Handler机制. 线程间通过Handler传递消息(Message).Message由一个FIFO的消息队列(MessageQueue)管理. 每个

android线程控制UI更新(Handler 、post()、postDelayed()、postAtTime)

按照下面的理解就是handler与ui线程有一定的关联可以因为更新界面只能在主线程中所有更新界面的地方可以在接受消息的handleMessage那里还有更新界面可以在handler.port(new Runnable))在自定义的线程中然后执行post方法通知主线程去更新这个界面 下面是参考: Android 线程是单线程的. 所以更新UI要用到Handler: private Handler splashHandler = new Handler() {public void handleMe

android线程消息传递机制——Looper,Handler,Message

android线程消息传递机制——Looper,Handler,Message 在引入这些概念之前,我们先了解一下引入这些机制的背景. 出于性能优化的考虑,Android的UI操作并不是线程安全的(如果你不懂什么是线程安全,可以阅读一下<一起探究多进程与多线程>里的数据安全与可重入),这意味着如果有多个线程同时操作某个UI组件,可能导致线程安全问题.为了解决这个问题,Android制定了一条简单的规则:只允许UI线程修改Activity里的UI组件.这个UI线程也通常被我们称为主线程. 在此引

Android开发:Handler Runnable和Thread之间的区别和联系 应用--------------------看完本篇,从此一览无余!

http://blog.csdn.net/yanzi1225627/article/details/8582081 在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口:Thread类是在java.lang包中定义的.一个类只要继承了Thread类同时覆写了本类中的run()方法就可以实现多线程操作了,但是一个类只能继承一个父类,这是此方法的局限. 下面看例子: package org.thread.demo; class MyThread extends

Android中的Handler, Looper, MessageQueue和Thread

Android中的Handler, Looper, MessageQueue和Thread 前几天,和同事探讨了一下Android中的消息机制,探究了消息的发送和接收过程以及与线程之间的关系.虽然我们经常使用这些基础的东西,但对于其内部原理的了解,能使我们更加容易.合理地架构系统,并避免一些低级错误. 对于这部分的内容,将分成4小节来描述: 1.职责与关系 2.消息循环 3.线程与更新 4.几点小结 ------------------------------------------------

Android 线程 Looper.prepare()、Looper.loop() 使用

优化项目过程中发现了一个很Low的问题,整理一下,备忘: 说问题之前先看下HandlerThread的定义 一个封装了looper的线程: Looper用于封装了android线程中的消息循环,默认情况下一个线程是不存在消息循环(message loop)的,需要调用Looper.prepare()来给线程创建一个消息循环,调用Looper.loop()来使消息循环起作用,从消息队列里取消息,处理消息. 注:写在Looper.loop()之后的代码不会被立即执行,当调用后mHandler.get