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.\n").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转换的值,所以只有开启另外的一个线程,来进行显示值的更新。