• 新建线程与UI线程间的通信


    现在用一个实例来演示一下自己的新建线程与UI线程间的通信。

    UI界面包含3个控件:

    一个输入框,用来输入数字;

    一个显示框,用来显示从2开始,到输入数字之间的所有质数;

    一个按钮,点击后获取输入框输入的数字,交给新建线程处理,线程计算质数后把结果传给UI线程,UI线程显示结果到显示框。

    XML如下:

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     3     android:layout_width="fill_parent"
     4     android:layout_height="fill_parent" >
     5 
     6     <ScrollView
     7         android:id="@+id/scrollView1"
     8         android:layout_width="match_parent"
     9         android:layout_height="fill_parent" >
    10 
    11         <LinearLayout
    12             android:layout_width="fill_parent"
    13             android:layout_height="fill_parent"
    14             android:orientation="vertical"
    15             android:weightSum="5" >
    16 
    17             <TextView
    18                 android:id="@+id/textView_for"
    19                 android:layout_width="wrap_content"
    20                 android:layout_height="wrap_content"
    21                 android:layout_gravity="center"
    22                 android:layout_weight="3"
    23                 android:text="Large Text"
    24                 android:textAppearance="?android:attr/textAppearanceLarge" />
    25 
    26             <EditText
    27                 android:id="@+id/editText1_upper"
    28                 android:layout_width="wrap_content"
    29                 android:layout_height="wrap_content"
    30                 android:layout_gravity="center"
    31                 android:ems="10"
    32                 android:inputType="number" />
    33 
    34             <Button
    35                 android:id="@+id/button_start_thread"
    36                 android:layout_width="wrap_content"
    37                 android:layout_height="wrap_content"
    38                 android:layout_gravity="center"
    39                 android:onClick="cal"
    40                 android:text="Button" />
    41         </LinearLayout>
    42     </ScrollView>
    43 
    44 </RelativeLayout>

    逻辑代码如下:

      1 package com.example.mystudy;
      2 
      3 import android.app.Activity;
      4 import android.os.Bundle;
      5 import android.os.Handler;
      6 import android.os.Looper;
      7 import android.os.Message;
      8 import android.view.View;
      9 import android.widget.EditText;
     10 import android.widget.TextView;
     11 
     12 import java.util.ArrayList;
     13 import java.util.List;
     14 
     15 public class MyThreadTest extends Activity {
     16     static final String UPPER_NUM = "upper";
     17     static final String NUMS = "nums";
     18     TextView textView;
     19     EditText editText;
     20     MyThread myThread;
     21 
     22     @Override
     23     protected void onCreate(Bundle savedInstanceState) {
     24 
     25         super.onCreate(savedInstanceState);
     26         setContentView(R.layout.button_and_textview);
     27         editText = (EditText) findViewById(R.id.editText1_upper);
     28         textView = (TextView) findViewById(R.id.textView_for);
     29 
     30         myThread = new MyThread();
     31         myThread.start();// 创建线程
     32 
     33     }
     34 
     35     public void cal(View v) {// 点击事件
     36 
     37         if (editText.getText().toString().equals("")) {
     38             textView.setText("");
     39             return;
     40         }
     41         Message message = new Message();
     42         Bundle bundle = new Bundle();
     43         bundle.putInt(UPPER_NUM, Integer.parseInt(editText.getText().toString()));// 将输入值发给新线程
     44         message.setData(bundle);
     45         message.what = 0x123;
     46         myThread.mHander.sendMessage(message);// 调用自己的线程中的hander来发送message,将消息放进线程的消息队列中等待hander处理
     47 
     48     }
     49 
     50     class MyThread extends Thread {
     51         public Handler mHander;// 本线程的hander
     52 
     53         @Override
     54         public void run() {
     55             Looper.prepare();// 创建本线程的looper
     56             mHander = new Handler() { // 实现自己的handler
     57 
     58                 @Override
     59                 public void handleMessage(Message msg) {
     60                     if (msg.what == 0x123) {// 计算质数
     61                         int upper = msg.getData().getInt(UPPER_NUM);
     62                         List<Integer> nums = new ArrayList<Integer>();
     63                         outer:
     64                         for (int i = 2; i <= upper; i++) {
     65                             for (int j = 2; j < Math.sqrt(i); j++) {
     66                                 if (i != 2 && i % j == 0) {
     67                                     continue outer;
     68                                 }
     69                             }
     70                             nums.add(i);
     71                         }
     72 
     73                         Message msg1 = new Message();
     74                         Bundle bundle = new Bundle();
     75                         bundle.putCharSequence(NUMS, nums.toString());
     76                         msg1.setData(bundle);
     77                         msg1.what = 0x124;
     78                         mainHandler.sendMessage(msg1);// 发送给主线程
     79 
     80                     }
     81 
     82                 }
     83 
     84             };
     85             Looper.loop();// 启动looper
     86         }
     87     }
     88 
     89     Handler mainHandler = new Handler() {// UI线程的hander
     90 
     91         @Override
     92         public void handleMessage(Message msg) {
     93             if (msg.what == 0x124) {
     94                 String nums = msg.getData().getCharSequence(NUMS, "no result").toString();
     95                 textView.setText(nums.toString());
     96             }
     97 
     98         }
     99 
    100     };
    101 
    102 }
  • 相关阅读:
    Spring AOP (下)
    C#和C++性能差距巨大,在高耗能和低性能设备上强烈建议不要使用
    [MOSS]Microsoft Office SharePoint Server 2007 安装与配置
    [MOSS]使用Microsoft Office SharePoint Server 2007过程中遇到的问题与解决方法
    博客索引
    springweb里面的post和get请求
    Nginx 之在windows下的安装与启动
    某外企招聘程序员部分面试题,求作答!!!
    解决Asp.net Web网站发布到服务器上运行时,某界面传参数过多,造成的“此请求的查询字符串的长度超过配置的 maxQueryStringLength 值”错误。
    使用”Sql Server 代理“下的”作业“定时执行期望的任务
  • 原文地址:https://www.cnblogs.com/csxcode/p/4156364.html
Copyright © 2020-2023  润新知