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

  • 相关阅读:
    深入浅出js单例模式
    前端常见面试-存储/缓存篇
    JavaScript内存管理
    delete操作符
    解决window.location.href跳转无效问题解决办法
    前端程序员经常忽视的一个JavaScript面试题
    【华为云技术分享】漫谈LiteOS-端云互通组件-MQTT开发指南(上)
    【华为云技术分享】序列特征的处理方法之二:基于卷积神经网络方法
    【华为云技术分享】原来CTR预估模型的发展有这样的规律
    【华为云技术分享】在家办公怎么弄?华为云DevCloud宝典一看就懂——项目管理篇
  • 原文地址:https://www.cnblogs.com/liangxinzhi/p/4275621.html
Copyright © 2020-2023  润新知