adc的上层应用:在UI主线程中,通过Handler机制,在自定义的线程与主线程之间进行消息的传递,从而更新文本控件显示ADC转换的值
AdcActivity.java
package com.under.adc; import java.text.DecimalFormat; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.app.Activity; import android.app.AlertDialog; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.Button; import android.widget.TextView; public class AdcActivity extends Activity { TextView textView; boolean flag=false; MyThread myThread; Handler handler; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_adc); textView=(TextView) findViewById(R.id.dis); handler=new Handler(){//使用Handler机制进行消息的传递,进行ADC转换值的更新 @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub //更新显示的ADC转换的值 textView.setText(getResources().getString(R.string.con)+new DecimalFormat("#.###").format((float)adcRead()*3.3/1024)+" V"); } }; if(!adcInit()) //初始化adc { new AlertDialog.Builder(AdcActivity.this).setTitle("error").setMessage("can not init. ").setPositiveButton("确定", null).show(); } } public void openADC(View view) //按钮的单击事件 { Button button=(Button)view; if(button.getText().equals("打开ADC")) { flag=true; //更改执行标志 button.setText("关闭ADC"); //更改显示文本 if (myThread==null) { //判断线程的状态 myThread=new MyThread(AdcActivity.this); myThread.start(); } } else { flag=false; button.setText("打开ADC"); //if(myThread.isAlive()) myThread.interrupt(); myThread.interrupt(); //中断线程 myThread=null; } } //本地方法 public native static boolean adcInit(); public native static boolean adcClose(); public native static int adcRead(); //加载动态共享库 static{ System.loadLibrary("adcunders"); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. menu.add(0, 1, 0, "退出"); return true; } //退出系统 @Override public boolean onOptionsItemSelected(MenuItem item) { // TODO Auto-generated method stub adcClose(); this.finish(); return true; } class MyThread extends Thread //自定义线程 { AdcActivity activity; public MyThread(AdcActivity activity) { this.activity=activity; } @Override public void run() { // TODO Auto-generated method stub while(flag) { //消息的传递 activity.handler.sendEmptyMessage(activity.adcRead()); } //textView.setText(getResources().getString(R.string.con)); } } }
activity_adc.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/LinearLayout1" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" > <Button android:id="@+id/open" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="打开ADC" android:onClick="openADC" android:layout_marginRight="30dp" /> <TextView android:id="@+id/dis" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="@string/con" /> </LinearLayout>
对于这里为什么要采用Hanlder机制进行文本控件显示ADC值的更新,为什么不直接在myThread线程进行文本控件值的更新?
因为在Android中,非UI主线程中是无法访问Activity里的Widget的,当然也不能将运行的状态送出来,所以只有通过Handler机制,进行迂回,达到结果。
还有一个原因,因为要不断更新ADC转换的值,所以只有开启另外的一个线程,来进行显示值的更新。