TQ210搭载Android4.0.3系统构建之ADC从驱动到HAL到JNI到应用程序(应用程序篇)

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

你可能感兴趣的:(Android4.0)