当前位置:  编程技术>移动开发
本页文章导读:
    ▪在工作线程中创造Toast        在工作线程中创建Toast 在工作线程中创建Toast,代码如下:   private void showToast() { new Thread() { public void run() { Looper.prepare(); Toast.makeText(ActivityA.this, "来自工作线程", Toast.LENGTH_.........
    ▪ 避免Menu键被障蔽        避免Menu键被屏蔽     大学毕业一年多了,最近忙于Android集群对讲项目开发,很少写博客,由于是第一次从事Android开发,这个项目已发布了几个稳定的版本,心理也特有成就感,感觉自.........
    ▪ 遍历项目文件夹上的所有文件       遍历项目文件夹下的所有文件 package com.huawei.test;import java.io.File;import java.io.FileOutputStream;import java.util.List;import org.dom4j.Document;import org.dom4j.DocumentHelper;import org.dom4j.Element;import org.dom4j.io.Output.........

[1]在工作线程中创造Toast
    来源: 互联网  发布时间: 2014-02-18
在工作线程中创建Toast

在工作线程中创建Toast,代码如下:

 

private void showToast() {
		new Thread() {
			public void run() {
				
				Looper.prepare();
				Toast.makeText(ActivityA.this, "来自工作线程", 

Toast.LENGTH_SHORT).show();
				Looper.loop();
			}
		}.start();
	}
 

 

 

如果不加Looper.prepare();则会出现以下异常:

java.lang.RuntimeException: Can't create handler inside thread that has not called 

Looper.prepare()
 

 

所以 在工作线程中创建Toast 须创建Looper对象。Looper.prepare();会创建当前线程的Looper对象和对应的MessageQueue(消息队列)

 

 

请参看Toast.java源码。

 Toast.java 包含 这句代码:final Handler mHandler = new Handler();   

mHandler是Toast的一个final类型的成员变量,在Handler的构造方法中有如下代码:

 

if (mLooper == null) {
            throw new RuntimeException(
                "Can't create handler inside thread that has not called 

Looper.prepare()");
        }
 

 

创建了Toast对象后,调用show()方法,把mShow这个Runnable添加到工作线程的消息队列中,

 

消息队列是在创建Looper对象的时候创建好的。

如代码:

 

final Runnable mShow = new Runnable() {
            public void run() {
                handleShow();
            }
        };

public void show() {
            if (localLOGV) Log.v(TAG, "SHOW: " + this);
            mHandler.post(mShow);
        }

/**
     * Causes the Runnable r to be added to the message queue.
     * The runnable will be run on the thread to which this handler is 
     * attached. 
     *  
     */
    public final boolean post(Runnable r)
    {
       return  sendMessageDelayed(getPostMessage(r), 0);
    }
 

此时调用Looper.loop(),从消息队列中取出消息,并执行。

主要源码:

 /**

     *  Run the message queue in this thread. Be sure to call
     * {@link #quit()} to end the loop.
     */
    public static final void loop() {
        Looper me = myLooper();
        MessageQueue queue = me.mQueue;
        while (true) {
            Message msg = queue.next(); // might block
            ......
                msg.target.dispatchMessage(msg);
               ......
                msg.recycle();
            }
        }
    }
 

此时会调用:mShow的handleShow();

源码:

 public void handleShow() {

            if (localLOGV) Log.v(TAG, "HANDLE SHOW: " + this + " mView=" + mView
                    + " mNextView=" + mNextView);
            if (mView != mNextView) {
                // remove the old view if necessary
                handleHide();
                mView = mNextView;
                mWM = WindowManagerImpl.getDefault();
                final int gravity = mGravity;
                mParams.gravity = gravity;
                if ((gravity & Gravity.HORIZONTAL_GRAVITY_MASK) == 

Gravity.FILL_HORIZONTAL) {
                    mParams.horizontalWeight = 1.0f;
                }
                if ((gravity & Gravity.VERTICAL_GRAVITY_MASK) == 

Gravity.FILL_VERTICAL) {
                    mParams.verticalWeight = 1.0f;
                }
                mParams.x = mX;
                mParams.y = mY;
                mParams.verticalMargin = mVerticalMargin;
                mParams.horizontalMargin = mHorizontalMargin;
                if (mView.getParent() != null) {
                    if (localLOGV) Log.v(
                            TAG, "REMOVE! " + mView + " in " + this);
                    mWM.removeView(mView);
                }
                if (localLOGV) Log.v(TAG, "ADD! " + mView + " in " + this);
                mWM.addView(mView, mParams);
            }
        }
 

mWM.addView(mView, mParams);把Toast对应的view添加到当前Window中。

举一反三:

基于以上原理,可以实现这样的效果,拖动GridView里的ImageView元素,改变元素在GridView的位置。


    
[2] 避免Menu键被障蔽
    来源: 互联网  发布时间: 2014-02-18
避免Menu键被屏蔽
    大学毕业一年多了,最近忙于Android集群对讲项目开发,很少写博客,由于是第一次从事Android开发,这个项目已发布了几个稳定的版本,心理也特有成就感,感觉自己学习能力还是挺强的,但是也遇到了许多小问题。在Activity中重写onKeyDown方法,Menu键被屏蔽但HOME键未被屏蔽,其中还HOME屏蔽在我的另外一篇博客中已详细介绍,下面来解决Menu键被屏蔽,让其中MENU键有效。
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_MENU) {
 super.openOptionsMenu(); 
}
return true;
}


    
[3] 遍历项目文件夹上的所有文件
    来源: 互联网  发布时间: 2014-02-18
遍历项目文件夹下的所有文件
package com.huawei.test;

import java.io.File;
import java.io.FileOutputStream;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;

public class InsertElement {

/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {


//递归项目文件夹下的所有文件夹及其中文件
  File root = new File("E:\\eclipse3.6space\\Task");
  showAllFiles(root);
}

final static void showAllFiles(File dir) throws Exception{
  File[] fs = dir.listFiles();
  for(int i=0; i<fs.length; i++){
  if(fs[i].getAbsolutePath().contains("strings.xml")
  && !fs[i].getAbsolutePath().contains("large")){
  System.out.println(fs[i].getAbsolutePath());
  }
   if(fs[i].isDirectory()){
    try{
     showAllFiles(fs[i]);
    }catch(Exception e){}
   }
  }
 
try { 
OutputFormat format = OutputFormat.createPrettyPrint(); 
format.setEncoding("utf-8"); 
            SAXReader reader = new SAXReader(); 
            Document document = reader.read("C:\\Users\\Administrator\\Desktop\\strings.xml"); 
            Element root = document.getRootElement(); 
            List<Element> elements = root.elements(); 
            int index = 0; 
            for(Element element:elements){ 
                index++; 
                if("app_name".equals(element.attributeValue("name"))){ 
                    Element elem = DocumentHelper.createElement("string");
                    elem.addAttribute("name", "bbb"); 
                    elem.setText("ppppppp");
//                    elem.addAttribute("name", "ccc"); 
                    elements.add(index,elem); 
                    break; 
                } 
            } 
           
            OutputFormat format1 = OutputFormat.createPrettyPrint();//缩减型格式
          //OutputFormat format = OutputFormat.createCompactFormat();//紧凑型格式
          format1.setEncoding("utf-8");//设置编码
//          //format.setTrimText(false);//设置text中是否要删除其中多余的空格
            org.dom4j.io.XMLWriter xmlWriter = new org.dom4j.io.XMLWriter(
                    new FileOutputStream( new File("C:\\Users\\Administrator\\Desktop\\strings.xml")),format1);
//            XMLWriter writer = new XMLWriter(new FileWriter("C:\\Users\\Administrator\\Desktop\\strings.xml"),format); 
            xmlWriter.write(document); 
            xmlWriter.close(); 
        } catch (Exception e) { 
            // TODO Auto-generated catch block 
            e.printStackTrace(); 
        } 

}

}

    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3