Android编程--常用代码

1. 如何使用Handler?

创建Handler的方式:

1) new Handler() 
    创建目前正在执行此指令的线程的Handler对象,其Looper通过Looper.Looper.myLooper()获取
2) new Handler(Looper)
    创建指定Looper线程的Handler对象, 如new Handler(Looper.getMainLooper())创建主线程的Handler对象


发送Message方案一:

    static final int KEEP_SCREEN_ON_MSG = 1;
    static final int GET_NEW_SURFACE_MSG = 2;
    static final int UPDATE_WINDOW_MSG = 3;

    final Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case KEEP_SCREEN_ON_MSG: {
                    setKeepScreenOn(msg.arg1 != 0);
                } break;
                case GET_NEW_SURFACE_MSG: {
                    handleGetNewSurface();
                } break;
                case UPDATE_WINDOW_MSG: {
                    updateWindow(false, false);
                } break;
            }
        }
    };

    //发送空消息
    mHandler.sendEmptyMessage(UPDATE_WINDOW_MSG);

    //发送一个Message
    Message msg = mHandler.obtainMessage(GET_NEW_SURFACE_MSG);
    mHandler.sendMessage(msg);


发送Message方案二:

    class AudioHandler extends Handler {
    
            private void setDeviceVolume(VolumeStreamState streamState, int device) {
                //do something
            }
    
            private void setAllVolumes(VolumeStreamState streamState) {
                //do something
            }
    
            @Override
            public void handleMessage(Message msg) {
    
                switch (msg.what) {
    
                    case MSG_SET_DEVICE_VOLUME:
                        setDeviceVolume((VolumeStreamState) msg.obj, msg.arg1);
                        break;
    
                    case MSG_SET_ALL_VOLUMES:
                        setAllVolumes((VolumeStreamState) msg.obj);
                        break;
                    // ...
                }
            }
        }

发送Runnable方案三:

public class MainActivity extends Activity {
    private Handler h;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		
        h = new Handler(){
            public void handleMessage(Message msg) {
                //do nothing
            }
        }; 
        
        h.post(new myRun());
	}
    
    class myRun implements Runnable{
        public void run(){ 
            setTitle(String.valueOf(1));
            h.postDelayed(testRun, 2000);
        }
    }

    Runnable testRun= new Runnable() {
        public void run(){
            setTitle(String.valueOf(2));
        }
    };
}


2. 如何使用Looper

Looper.prepare();
// 创建Handler        
Looper.loop();
// 在此线程中创建的Handler将向Looper的MessageQueue发送消息


3. 创建、实现、启动线程

方案一:

    new Thread(){
        public void run(){
             //do something you want to do
        }
    }.start();

方案二:

    class Task implements Runnable {
        public void run() {
             // do something you want to do
        }
    }
    
    Task ta = new Task();
    Thread t1 = new Thread(ta, "MyTask");
    t1.start();

方案三:

    class MyThread extends Thread {
        public MyThread() {
            super("MyThread");
        }

        @Override
        public void run() {
            Looper.prepare();
            mMyLooper = Looper.myLooper();
            mAudioHandler = new AudioHandler();
            //do something you want to do  
            Looper.loop();
        }
    }

    AudioHandler mAudioHandler;
    Looper mMyLooper;
    MyThread mMyThread = new MyThread();
    mMyThread.start(); //启动线程
    // wait some event
    mMyLooper.quit(); //使线程退出


4. 实现SurfaceHolder

    在SurfaceView中实现的SurfaceHolder如下:

    private SurfaceHolder mSurfaceHolder = new SurfaceHolder() {
        
        private static final String LOG_TAG = "SurfaceHolder";
        
        public boolean isCreating() {
            return mIsCreating;
        }

        public void addCallback(Callback callback) {
            synchronized (mCallbacks) {
                // This is a linear search, but in practice we'll 
                // have only a couple callbacks, so it doesn't matter.
                if (mCallbacks.contains(callback) == false) {      
                    mCallbacks.add(callback);
                }
            }
        }

        public void removeCallback(Callback callback) {
            synchronized (mCallbacks) {
                mCallbacks.remove(callback);
            }
        }
        
        public void setFixedSize(int width, int height) {
            if (mRequestedWidth != width || mRequestedHeight != height) {
                mRequestedWidth = width;
                mRequestedHeight = height;
                requestLayout();
            }
        }

        public void setSizeFromLayout() {
            if (mRequestedWidth != -1 || mRequestedHeight != -1) {
                mRequestedWidth = mRequestedHeight = -1;
                requestLayout();
            }
        }

        public void setFormat(int format) {

            // for backward compatibility reason, OPAQUE always
            // means 565 for SurfaceView
            if (format == PixelFormat.OPAQUE)
                format = PixelFormat.RGB_565;

            mRequestedFormat = format;
            if (mWindow != null) {
                updateWindow(false, false);
            }
        }

        /**
         * @deprecated setType is now ignored.
         */
        @Deprecated
        public void setType(int type) { }

        public void setKeepScreenOn(boolean screenOn) {
            Message msg = mHandler.obtainMessage(KEEP_SCREEN_ON_MSG);
            msg.arg1 = screenOn ? 1 : 0;
            mHandler.sendMessage(msg);
        }
        
        public Canvas lockCanvas() {
            return internalLockCanvas(null);
        }

        public Canvas lockCanvas(Rect dirty) {
            return internalLockCanvas(dirty);
        }

        private final Canvas internalLockCanvas(Rect dirty) {
            mSurfaceLock.lock();

            if (DEBUG) Log.i(TAG, "Locking canvas... stopped="
                    + mDrawingStopped + ", win=" + mWindow);

            Canvas c = null;
            if (!mDrawingStopped && mWindow != null) {
                if (dirty == null) {
                    if (mTmpDirty == null) {
                        mTmpDirty = new Rect();
                    }
                    mTmpDirty.set(mSurfaceFrame);
                    dirty = mTmpDirty;
                }

                try {
                    c = mSurface.lockCanvas(dirty);
                } catch (Exception e) {
                    Log.e(LOG_TAG, "Exception locking surface", e);
                }
            }

            if (DEBUG) Log.i(TAG, "Returned canvas: " + c);
            if (c != null) {
                mLastLockTime = SystemClock.uptimeMillis();
                return c;
            }
            
            // If the Surface is not ready to be drawn, then return null,
            // but throttle calls to this function so it isn't called more
            // than every 100ms.
            long now = SystemClock.uptimeMillis();
            long nextTime = mLastLockTime + 100;
            if (nextTime > now) {
                try {
                    Thread.sleep(nextTime-now);
                } catch (InterruptedException e) {
                }
                now = SystemClock.uptimeMillis();
            }
            mLastLockTime = now;
            mSurfaceLock.unlock();
            
            return null;
        }

        public void unlockCanvasAndPost(Canvas canvas) {
            mSurface.unlockCanvasAndPost(canvas);
            mSurfaceLock.unlock();
        }

        public Surface getSurface() {
            return mSurface;
        }

        public Rect getSurfaceFrame() {
            return mSurfaceFrame;
        }
    }

5. 使用ProgressDialog

public class MainActivity extends Activity {
	ProgressDialog mDialog;
	MyThread mThread;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		// create and display the progress in a new thread
        mDialog = new ProgressDialog(MainActivity.this);  
        mDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);  
        mDialog.setTitle("MyTitle");  
        //mDialog.setIcon(R.drawable.icon);  
        mDialog.setMessage("This is a progress example!");  
        mDialog.setMax(100);  
        mDialog.setProgress(0);  
        //mDialog.setSecondaryProgress(50);  
        mDialog.setIndeterminate(false);  
        mDialog.setCancelable(true);  
        mDialog.show(); 
        
		mThread = new MyThread();
		mThread.start();
	}

	public class MyThread extends Thread {
		MyThread(){
			super("MyThread");
		}
		@Override
		public void run(){
			int i=0;
			while(i<100){
				i++;
				// set the progress value
				mDialog.setProgress(i);
				try{
					Thread.sleep(100); // sleep 1s
				}catch(InterruptedException e){
					e.printStackTrace();
				}
			}
			// destroy the progress
			mDialog.dismiss();
		}
	}
}

6. 如何使用Timer and TimerTask?

package com.example.mytest;

import java.util.Timer;
import java.util.TimerTask;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.view.Menu;

public class MainActivity extends Activity {
    private Timer timer = new Timer();
    private Handler h;
    private int k = 0;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		
        h = new Handler(){
            public void handleMessage(Message msg) {
                setTitle((String)msg.obj);
            }
        }; 

        // init and start the timer
        init();
	}

    public void init() {
    	//public abstract class TimerTask implements Runnable
        TimerTask task = new TimerTask(){
            @Override 
            public void run() {
                h.removeMessages(0);
                Message m = h.obtainMessage(1, 1, 1,Thread.currentThread().getName() + " : "+String.valueOf(k++));
                h.sendMessage(m);
            }
        };
        // after 500ms execute task firstly, then every 1000ms execute the task
        timer.schedule(task, 500, 1000); //启动Timer线程
    }
}











  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: arm-linux-androideabi-4.9是一个基于ARM架构的交叉编译器工具集。它用于在Linux操作系统上生成针对Android操作系统的ARM架构的可执行文件。 交叉编译器工具集是一组软件工具,用于将源代码从一种处理器架构(例如x86)转换为另一种处理器架构(例如ARM)。换句话说,它可以让开发人员在一种平台上开发软件,并将其编译成在另一种平台上运行的可执行文件。 在Android开发中,我们通常将Android操作系统视为目标平台,并希望能够在开发主机上编译和调试我们的应用程序。然而,Android平台使用的是ARM架构,而大多数开发主机使用的是x86架构。因此,我们需要一个交叉编译器工具集来生成ARM架构的可执行文件。 arm-linux-androideabi-4.9是一个常用的交叉编译器工具集版本,它是基于GCC(GNU编译器集合)构建的。它支持C、C++和其他一些编程语言,并提供了一系列的命令行工具,例如编译器、连接器和调试器。通过使用这个工具集,开发人员可以在他们的开发主机上编写、编译和调试ARM架构的应用程序,并将它们部署到Android设备上运行。 总之,arm-linux-androideabi-4.9是一个用于在Linux操作系统上生成ARM架构的Android应用程序的交叉编译器工具集。它是Android开发中的重要工具之一,使开发人员能够在开发主机上进行高效的应用程序开发和调试。 ### 回答2: arm-linux-androideabi-4.9是一个编译工具链的版本号,用于在ARM架构的Android设备上进行开发和编译。其中,arm表示所使用的处理器架构为ARM;linux表示编译工具链用于在Linux系统上进行开发和编译;androideabi表示该编译工具链是用于Android设备上进行应用程序开发和编译的;4.9表示这个编译工具链的版本号为4.9。 编译工具链是用于将源代码转化为可执行文件的一系列工具的集合。在开发Android应用程序时,通常会使用编译工具链来编译C/C++源代码,将其转化为在设备上可以运行的机器码。arm-linux-androideabi-4.9是一个适用于ARM架构的Android设备的编译工具链,其版本号为4.9。 通过使用arm-linux-androideabi-4.9,开发者可以在他们的开发环境中编译C/C++源代码,并生成可在ARM架构的Android设备上运行的二进制文件。这样,开发者就可以针对特定的Android设备,使用这个编译工具链来生成对应的可执行文件,以达到更好的性能和兼容性。 总之,arm-linux-androideabi-4.9是一个针对ARM架构的Android设备开发和编译的工具链版本号,通过使用它可以编译C/C++源代码,并生成可在Android设备上运行的二进制文件。 ### 回答3: arm-linux-androideabi-4.9,是指适用于ARM架构的Linux系统以及Andorid平台的GNU工具链的版本号。这个版本的工具链由GCC(GNU编译器集合)组成,用于编译C、C++等高级语言,并将其转化为适合在ARM架构上运行的机器码。 arm-linux-androideabi-4.9中的"arm"表示这个工具链是为ARM架构设计的,"linux"表示它可以运行在Linux系统上,"androideabi"表示它是专门用于Android平台的编译工具链,"4.9"表示这个版本的GCC系列为4.9。 这个工具链主要包含了编译器(gcc)、链接器(ld)以及一些辅助的工具(如assembler、objcopy等),可以将高级语言的源代码编译为ARM体系结构下的机器码,从而方便在ARM架构的设备上运行。而Android平台对应的工具链会提供一些额外的功能,如对ARM架构下的硬件加速(如NEON指令集)的支持等。 使用这个工具链可以帮助开发者编译和构建ARM架构上的应用程序。在Android开发中,特别是进行底层开发和系统级编程时,我们会使用这个工具链来编译和生成可执行文件,进行调试和测试。 总之,arm-linux-androideabi-4.9是一款用于ARM架构的Linux系统和Android平台上的GCC工具链的版本。它为开发者提供了编译、链接和构建应用程序所需的工具和功能,帮助开发者在ARM架构设备上进行软件开发。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值