咖啡伴侣

呆在上海
posts - 163, comments - 156, trackbacks - 0, articles - 2

屏幕大小
1、不同的layout

      Android手机屏幕大小不一,有480x320,640x360,800x480.怎样才能让App自动适应不同的屏幕呢? 其实很简单,只需要在res目录下创建不同的layout文件夹,比如:layout-640x360,layout-800x480,所有的 layout文件在编译之后都会写入R.java里,而系统会根据屏幕的大小自己选择合适的layout进行使用。

2、hdpi、mdpi、ldpi

      前的版本中,只有一个drawable,而2.1版本中有drawable-mdpi、drawable-ldpi、drawable-hdpi三个,这三个主要是为了支持多分辨率。

drawable- hdpi、drawable- mdpi、drawable-ldpi的区别:

1.drawable-hdpi里面存放高分辨率的图片,如WVGA (480x800),FWVGA (480x854)
2.drawable-mdpi里面存放中等分辨率的图片,如HVGA (320x480)
3.drawable-ldpi里面存放低分辨率的图片,如QVGA (240x320)
系统会根据机器的分辨率来分别到这几个文件夹里面去找对应的图片。在开发程序时为了兼容不同平台不同屏幕,建议各自文件夹根据需求均存放不同版本图片。

屏幕方向
1、横屏竖屏自动切换

      可以在res目录下建立layout-port和layout-land两个目录,里面分别放置竖屏和横屏两种布局文件,这样在手机屏幕方向变化的时候系统会自动调用相应的布局文件,避免一种布局文件无法满足两种屏幕显示的问题。

2、禁用自动切换

只需要在AndroidManifest.xml文件中加入android:screenOrientation属性限制。

•Android:screenOrientation="landscape"  //是限制此页面横屏显示
•Android:screenOrientation="portrait"      //是限制此页面数竖屏显示
字体自适应大小
方法1:

首先根据不同分辨率获取不同字体大小。
在RES里创建
values-480x320/strings.xml 里面设置<dimen name="Text_size">30px</dimen>

values-800x400/strings.xml 里面设置<dimen name="Text_size">30px</dimen>

分别代表480X320 和 800X400分辨率情况下 字号为30px和40px;

在java文件中这样调用

int sizeOfText = (int) this.getResources().getDimension(R.dimen.Text_size);

方法2:

在视图的 onsizechanged里获取视图宽度,一般情况下默认宽度是320,所以计算一个缩放比率rate = (float) w/320   w是实际宽度
然后在设置字体尺寸时 paint.setTextSize((int)(8*rate));   8是在分辨率宽为320 下需要设置的字体大小实际字体大小 = 默认字体大小 x  rate

posted @ 2011-09-02 09:28 oathleo 阅读(1242) | 评论 (0)编辑 收藏

首先内部存储路径为/data/data/youPackageName/,下面讲解的各路径都是基于你自己的应用的内部存储路径下。所有内部存储中保存的文件在用户卸载应用的时候会被删除。

一、 files
1. Context.getFilesDir(),该方法返回/data/data/youPackageName/files的File对象。
2. Context.openFileInput()与Context.openFileOutput(),只能读取和写入files下的文件,返回的是FileInputStream和FileOutputStream对象。
3. Context.fileList(),返回files下所有的文件名,返回的是String[]对象。
4. Context.deleteFile(String),删除files下指定名称的文件。

二、cache
1. Context.getCacheDir(),该方法返回/data/data/youPackageName/cache的File对象。

三、custom dir

getDir(String name, int mode),返回/data/data/youPackageName/下的指定名称的文件夹File对象,如果该文件夹不存在则用指定名称创建一个新的文件夹。



有了数据存储 API,您可以使用内部存储器存储数据。信息可以是私有的,您可以有选择地让其他应用程序对之具有读或写的访问权限。本节介绍这个存储私有数据的 API,它使用 android.content.Context.openFileInput、openFileOutput 和 getCacheDir() 来高速缓存数据,而不是永久地存储。

清单 20 中的代码片段展示了如何从内部私有存储器读取数据。使得存储器为私有的方法是对 openFileOutput() 使用MODE_PRIVATE。


清单 20. 从本地私有存储器读取数据

/**
 * Writes content to internal storage making the content private to 
 * the application. The method can be easily changed to take the MODE 
 * as argument and let the caller dictate the visibility: 
 * MODE_PRIVATE, MODE_WORLD_WRITEABLE, MODE_WORLD_READABLE, etc.
 * 
 * 
@param filename - the name of the file to create
 * 
@param content - the content to write
 
*/
public void writeInternalStoragePrivate(
        String filename, 
byte[] content) {
    
try {
        
//MODE_PRIVATE creates/replaces a file and makes 
        
//  it private to your application. Other modes:
        
//    MODE_WORLD_WRITEABLE
        
//    MODE_WORLD_READABLE
        
//    MODE_APPEND
        FileOutputStream fos = 
           openFileOutput(filename, Context.MODE_PRIVATE);
        fos.write(content);
        fos.close();
    } 
catch (FileNotFoundException e) {
        e.printStackTrace();
    } 
catch (IOException e) {
        e.printStackTrace();
    }
}


清单 21 中的代码片段展示了如何从内部私有存储器读取数据;注意 openFileInput() 的使用。


清单 21. 从内部私有存储器读取数据

/**
 * Reads a file from internal storage
 * 
@param filename the file to read from
 * 
@return the file content
 
*/
public byte[] readInternalStoragePrivate(String filename) {
    
int len = 1024;
    
byte[] buffer = new byte[len];
    
try {
        FileInputStream fis 
= openFileInput(filename);
        ByteArrayOutputStream baos 
= new ByteArrayOutputStream();
        
int nrb = fis.read(buffer, 0, len); // read up to len bytes
        while (nrb != -1) {
            baos.write(buffer, 
0, nrb);
            nrb 
= fis.read(buffer, 0, len);
        }
        buffer 
= baos.toByteArray();
        fis.close();
    } 
catch (FileNotFoundException e) {
        e.printStackTrace();
    } 
catch (IOException e) {
        e.printStackTrace();
    }
    
return buffer;
}


清单 22 展示了如何从内部私有存储器删除数据。


清单 22. 从本地私有存储器删除数据

    
/**
 * Delete internal private file
 * @param filename - the filename to delete
 */
public void deleteInternalStoragePrivate(String filename) {
    File file = getFileStreamPath(filename);
    if (file != null) {
        file.delete();
    }
}


现在可以来看为公共数据使用外部存储器了。

回页首

为公共数据使用设备的外部存储器

有了数据存储 API,您可以使用外部存储器存储数据。信息可以是私有的,您可以有选择地让其他应用程序对之具有读或写的访问权限。本节您将对此 API 进行编程,以便使用包括getExternalStorageState()、getExternalFilesDir()、getExternalStorageDirectory() 和getExternalStoragePublicDirectory() 在内的很多 API 来存储公共数据。您为公共数据使用下面的路径:/Android/data/<package_name>/files/。

在使用外部存储器之前,必须看看它是否可用,是否可写。下面两个代码片段展示了测试这些条件的帮助器方法。清单 23 测试外部存储器是否可用。


清单 23. 测试外部存储器是否可用

    
/**
 * Helper Method to Test if external Storage is Available
 */
public boolean isExternalStorageAvailable() {
    boolean state = false;
    String extStorageState = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED.equals(extStorageState)) {
        state = true;
    }
    return state;
}


清单 24 测试外部存储器是否只可读。


清单 24. 测试外部存储器是否只可读

    
/**
 * Helper Method to Test if external Storage is read only
 */
public boolean isExternalStorageReadOnly() {
    boolean state = false;
    String extStorageState = Environment.getExternalStorageState();
    if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(extStorageState)) {
        state = true;
    }
    return state;
}


清单 25 展示了如何写到外部存储器,以存储公共数据。


清单 25. 写到外部内存

    
/**
 * Write to external public directory
 * @param filename - the filename to write to
 * @param content - the content to write
 */
public void writeToExternalStoragePublic(String filename, byte[] content) {

    // API Level 7 or lower, use getExternalStorageDirectory()
    //  to open a File that represents the root of the external
    // storage, but writing to root is not recommended, and instead
    // application should write to application-specific directory, as shown below.

    String packageName = this.getPackageName();
    String path = "/Android/data/" + packageName + "/files/";

    if (isExternalStorageAvailable() &&
       !isExternalStorageReadOnly()) {
        try {
            File file = new File(path, filename);
            file.mkdirs();
            FileOutputStream fos = new FileOutputStream(file);
            fos.write(content);
            fos.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}


清单 26 展示了如何从外部存储器读取数据。


清单 26. 从外部内存读取数据

    
/**
 * Reads a file from internal storage
 * @param filename - the filename to read from
 * @return the file contents
 */
public byte[] readExternallStoragePublic(String filename) {
    int len = 1024;
    byte[] buffer = new byte[len];
    String packageName = this.getPackageName();
    String path = "/Android/data/" + packageName + "/files/";

    if (!isExternalStorageReadOnly()) {     
        try {
            File file = new File(path, filename);            
            FileInputStream fis = new FileInputStream(file);
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            int nrb = fis.read(buffer, 0, len); //read up to len bytes
            while (nrb != -1) {
                baos.write(buffer, 0, nrb);
                nrb = fis.read(buffer, 0, len);
            }
            buffer = baos.toByteArray();
            fis.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    return buffer;
}


清单 27 中的代码片段展示了如何从外部内存删除文件。


清单 27. 从外部内存删除文件

    
/**
 * Delete external public file
 * @param filename - the filename to write to
 */
void deleteExternalStoragePublicFile(String filename) {
    String packageName = this.getPackageName();
    String path = "/Android/data/" + packageName + "/files/"+filename;
    File file = new File(path, filename);
    if (file != null) {
        file.delete();
    }
}


处理外部存储器需要特殊的权限 WRITE_EXTERNAL_STORAGE,它通过 AndroidManifest.xml 请求得到(参见 清单 28)。


清单 28. WRITE_EXTERNAL_STORAGE

    
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>


外部存储 API 通过根据文件类型(比如 Pictures、Ringtones)将文件存储在预先确定的目录中,允许您公共地存储文件。本文没有介绍这种方法,但是您应该熟悉它。此外,记住外部存储器中的文件任何时候都可能消失。

回页首

相关的方法

如果您具有不需要长期永久保存的临时文件,那么可以将这些文件存储在高速缓存中。高速缓存是一种特殊的内存,可以用于存储中小型数据(少于兆字节),但是您一定要知道,取决于有多少内存可用,高速缓存的内容任何时候都可能被清除。

清单 29 展示了一个帮助器方法,它返回到内部内存中高速缓存的路径。


清单 29. 检索到内部内存高速缓存的路径

    
/**
 * Helper method to retrieve the absolute path to the application
 * specific internal cache directory on the file system. These files
 * will be ones that get deleted when the application is uninstalled or when
 * the device runs low on storage. There is no guarantee when these
 * files will be deleted.
 *
 * Note: This uses a Level 8+ API.
 *
 * @return the absolute path to the application specific cache
 * directory
 */
public String getInternalCacheDirectory() {
    String cacheDirPath = null;
    File cacheDir = getCacheDir();
    if (cacheDir != null) {
        cacheDirPath = cacheDir.getPath();
    }
    return cacheDirPath;        
}


清单 30 展示了一个帮助器方法,它返回到外部内存中高速缓存的路径。


清单 30. 检索到外部内存高速缓存的路径

    
/**
 * Helper method to retrieve the absolute path to the application
 * specific external cache directory on the file system. These files
 * will be ones that get deleted when the application is uninstalled or when
 * the device runs low on storage. There is no guarantee when these
 * files will be deleted.
 *
 * Note: This uses a Level 8+ API.
 *
 * @return the absolute path to the application specific cache
 * directory
 */
public String getExternalCacheDirectory() {
    String extCacheDirPath = null;
    File cacheDir = getExternalCacheDir();
    if (cacheDir != null) {
        extCacheDirPath = cacheDir.getPath();
    }
    return extCacheDirPath;     
}

 


通过使用示例应用程序,您现在应该很好地理解了如何为公共数据使用设备的外部存储器。

posted @ 2011-08-31 13:17 oathleo 阅读(2920) | 评论 (0)编辑 收藏

WebView对Javascript的支持也很强,google一个Java和Javascript互调的例子  
整个Eclipse ADT工程例子中都有,这里重点分析一下代码:
Java代码  收藏代码
  1. public class WebViewDemo extends Activity {  
  2.     private WebView mWebView;  
  3.     private Handler mHandler = new Handler();  
  4.   
  5.     public void onCreate(Bundle icicle) {  
  6.         super.onCreate(icicle);  
  7.         setContentView(R.layout.webviewdemo);  
  8.         mWebView = (WebView) findViewById(R.id.webview);  
  9.         WebSettings webSettings = mWebView.getSettings();  
  10.         webSettings.setJavaScriptEnabled(true);  
  11.         mWebView.addJavascriptInterface(new Object() {  
  12.             public void clickOnAndroid() {  
  13.                 mHandler.post(new Runnable() {  
  14.                     public void run() {  
  15.                         mWebView.loadUrl("javascript:wave()");  
  16.                     }  
  17.                 });  
  18.             }  
  19.         }, "demo");  
  20.         mWebView.loadUrl("file:///android_asset/demo.html");  
  21.     }  
  22. }  

这 里的重点是addJavascriptInterface(Object obj,String interfaceName)方法,该方法将一个java对象绑定到一个javascript对象中,javascript对象名就是 interfaceName,作用域是Global。这样初始化webview后,在webview加载的页面中就可以直接通过 javascript:window.demo访问到绑定的java对象了。来看看在html中是怎样调用的:

Html代码  收藏代码
  1. <html>  
  2.         <script language="javascript">  
  3.                 function wave() {  
  4.                     document.getElementById("droid").src="android_waving.png";  
  5.                 }  
  6.         </script>  
  7.         <body>  
  8.             <a onClick="window.demo.clickOnAndroid()">  
  9.                                 <img id="droid" src="android_normal.png"/><br>  
  10.                                 Click me!  
  11.             </a>  
  12.         </body>  
  13. </html>  

 这样在javascript中就可以调用java对象的clickOnAndroid()方法了,wave()方法是java中调用javascript的例子。

这里还有几个知识点:

1) 为了让WebView从apk文件中加载assets,Android SDK提供了一个schema,前缀为"file:///android_asset/"。WebView遇到这样的schema,就去当前包中的 assets目录中找内容。如上面的"file:///android_asset/demo.html"

2)addJavascriptInterface方法中要绑定的Java对象及方法要运行另外的线程中,不能运行在构造他的线程中,这也是使用Handler的目的。

posted @ 2011-08-25 15:36 oathleo 阅读(991) | 评论 (0)编辑 收藏

    <property name="proguard-home" value="D:/proguard4.4/lib"/>
    
<property name="android-jar" value="D:\android3.0\android-sdk_r12-windows\android-sdk-windows\platforms\android-8\android.jar"/>
//指定 proguard 地址和 android地址


<java jar="${proguard-home}/proguard.jar" fork="true" failonerror="true">
            
<jvmarg value="-Dmaximum.inlined.code.length=32" />
            
<arg value="-injars ${target_temp_jar}" />
            
<arg value="-outjars ${target_jar}" />
            
//第三方包
            <arg value="-libraryjars ${android-jar}" />
            
<arg value="-libraryjars lib/android_script.jar" />

            
<!--  <arg value="-libraryjars ${external-libs}/*.jar"/>-->
            
<arg value="-dontpreverify" />
            
<arg value="-dontoptimize" />
            
<arg value="-dontusemixedcaseclassnames" />
            
<arg value="-repackageclasses ''" />
            
<arg value="-allowaccessmodification" />
            
            
<!--保护public字段-->
            
<arg value="-keepclassmembers public class * { public protected *; }" />
            
<!--保护泛型-->
            
<arg value="-keepattributes Signature" />

            
<arg value="-keep public class com.xxxcore.*" />
            
<arg value="-keep public class com.xxxviewer.**" />
 
            
<arg value="-optimizationpasses 7" />
            
<arg value="-verbose" />
            
<arg value="-dontskipnonpubliclibraryclasses" />
            
<arg value="-dontskipnonpubliclibraryclassmembers" />
        
</java>

        
<signjar jar="${target_jar}" keystore="${sign.keystore}" alias="${sign.alias}" keypass="${sign.keypass}" storepass="${sign.storepass}"/>
        
<delete file="${target_temp_jar}" />
    
</target>




参数:

-include {filename}    从给定的文件中读取配置参数

-basedirectory {directoryname}    指定基础目录为以后相对的档案名称

-injars {class_path}    指定要处理的应用程序jar,war,ear和目录

-outjars {class_path}    指定处理完后要输出的jar,war,ear和目录的名称

-libraryjars {classpath}    指定要处理的应用程序jar,war,ear和目录所需要的程序库文件

-dontskipnonpubliclibraryclasses    指定不去忽略非公共的库类。

-dontskipnonpubliclibraryclassmembers    指定不去忽略包可见的库类的成员。


保留选项
-keep {Modifier} {class_specification}    保护指定的类文件和类的成员

-keepclassmembers {modifier} {class_specification}    保护指定类的成员,如果此类受到保护他们会保护的更好

-keepclasseswithmembers {class_specification}    保护指定的类和类的成员,但条件是所有指定的类和类成员是要存在。

-keepnames {class_specification}    保护指定的类和类的成员的名称(如果他们不会压缩步骤中删除)

-keepclassmembernames {class_specification}    保护指定的类的成员的名称(如果他们不会压缩步骤中删除)

-keepclasseswithmembernames {class_specification}    保护指定的类和类的成员的名称,如果所有指定的类成员出席(在压缩步骤之后)

-printseeds {filename}    列出类和类的成员-keep选项的清单,标准输出到给定的文件

压缩
-dontshrink    不压缩输入的类文件

-printusage {filename}

-whyareyoukeeping {class_specification}    

优化
-dontoptimize    不优化输入的类文件

-assumenosideeffects {class_specification}    优化时假设指定的方法,没有任何副作用

-allowaccessmodification    优化时允许访问并修改有修饰符的类和类的成员

混淆
-dontobfuscate    不混淆输入的类文件

-printmapping {filename}

-applymapping {filename}    重用映射增加混淆

-obfuscationdictionary {filename}    使用给定文件中的关键字作为要混淆方法的名称

-overloadaggressively    混淆时应用侵入式重载

-useuniqueclassmembernames    确定统一的混淆类的成员名称来增加混淆

-flattenpackagehierarchy {package_name}    重新包装所有重命名的包并放在给定的单一包中

-repackageclass {package_name}    重新包装所有重命名的类文件中放在给定的单一包中

-dontusemixedcaseclassnames    混淆时不会产生形形色色的类名

-keepattributes {attribute_name,}    保护给定的可选属性,例如LineNumberTable, LocalVariableTable, SourceFile, Deprecated, Synthetic, Signature, and InnerClasses.

-renamesourcefileattribute {string}    设置源文件中给定的字符串常量

posted @ 2011-08-24 14:39 oathleo 阅读(2495) | 评论 (0)编辑 收藏

注意
1.onDown 多指事件仍然响应成单指
2.onScroll滑动时触发,e1只能获得一个点 ,而e2却能获得多点。(搞不清楚为什么怎么设计)
3.想在view上加 GestureListener
可以使用下面的代码:
public class ViewerInnerTouchListener implements OnTouchListener {

    
private GestureDetector gestureDetector;

    
public ViewerInnerTouchListener(GAViewer viewer) {
        gestureDetector 
= new GestureDetector(new GestureListener(viewer));
    }

    
public boolean onTouch(View v, MotionEvent event) {
        gestureDetector.onTouchEvent(event);
        
return true;
    }

}

    setOnTouchListener(
new ViewerInnerTouchListener(this));

判断手势:
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        
if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
            Log.i(
"onFling""onFling");
            
return true// Right to left
        } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
            
return false// Left to right
        }
        
if (e1.getY() - e2.getY() > SWIPE_MIN_DISTANCE && Math.abs(velocityY) > SWIPE_THRESHOLD_VELOCITY) {
            
return false// Bottom to top
        } else if (e2.getY() - e1.getY() > SWIPE_MIN_DISTANCE && Math.abs(velocityY) > SWIPE_THRESHOLD_VELOCITY) {
            
return false// Top to bottom
        }
        
return false;
    }


GestureListener 的几个方法要理解
     //Touch down时触发,不论是touch (包括long) ,scroll
     public boolean onDown(MotionEvent e) {
     return false;
     }
    
     //Touch了还没有滑动时触发
     //(与onDown,onLongPress比较
     //onDown只要Touch down一定立刻触发。
     public void onShowPress(MotionEvent e) {
     }
    
     //Touch了不移动一直Touch down时触发
     //Touchdown后过一会没有滑动先触发onShowPress再是onLongPress。
     public void onLongPress(MotionEvent e) {
     }
    
     //上面这两个函数都是在touch down后又没有滑动(onScroll),又没有长按(onLongPress),然后Touchup时触发。
     /**
     * 点击一下非常快的(不滑动)Touchup: onDown->onSingleTapUp->onSingleTapConfirmed
     *
     点击一下稍微慢点的(不滑动)Touchup:onDown->onShowPress->onSingleTapUp->onSingleTapConfirmed
     * 点击longpress ,onScroll 时 不触发 onSingleTapUp
     */
     public boolean onSingleTapUp(MotionEvent e) {
     Log.i("onSingleTapUp", "onSingleTapUp");
     return false;
     }
    
     //Touch了滑动时触发
     public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
     float distanceY) {
     return true;
     }
    
     //Touch了滑动一点距离后,up时触发
     public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
     float velocityY) {
     return true;
     }

posted @ 2011-08-21 11:59 oathleo 阅读(3238) | 评论 (0)编辑 收藏

之 前一直没有搞懂android:padding和android:layout_margin的区别,其实概念很简单,padding是站在父view的 角度描述问题,它规定它里面的内容必须与这个父view边界的距离。margin则是站在自己的角度描述问题,规定自己和其他(上下左右)的view之间 的距离,如果同一级只有一个view,那么它的效果基本上就和padding一样了

posted @ 2011-08-18 16:33 oathleo 阅读(305) | 评论 (0)编辑 收藏

layout在xml里是无法使用findView 找到的

只能使用:
View menu = inflater.inflate(R.layout.main_left_layout, null);

获得
LayoutInflater 的方法:
1.Activity
LayoutInflater inflater = getLayoutInflater(); 
2.
LayoutInflater inflater = LayoutInflater.from(context);



posted @ 2011-08-16 12:53 oathleo 阅读(227) | 评论 (0)编辑 收藏

1、XML资源文件可以被AAPT打包进应用程序包,如果需要被打包,放置在/res/xml目录下,如果不需要被打包,放置在/res/raw下。

2、对/res/xml的支持

以读取/res/xml/test.xml为例

Resources res=activity.getResources();

XmlResourceParser xpp=res.getxml(R.xml.test);

inet eventType=xpp.getEventType();

再根据evenType的类型,判断读取了什么内容,比如说,读到了文档的开头,XmlPullParser.START_DOCUMENT等

使用xpp.getName()取得标志名称,使用xpp.getText()取得文本内容

最后

eventType=xpp.next();来读取下一行内容

3、对/res/raw的支持

以读取/res/raw/test.txt为例

Resources r=activity.getResources();

InputStream is=r.openRawResource(R.raw.test);

4、资产

/assets不会在R.java中生成资源ID,必须指定文件路径才能读取它们。文件路径是以/assets开头的相对路径。

AssetManger am=activity.getAssets();

InputStream is=am.open("test.txt");

posted @ 2011-08-08 11:24 oathleo 阅读(485) | 评论 (0)编辑 收藏

     摘要: 在Android 2.3状态栏中添加menu,home和back快捷键的方法 1、准备资源,修改XML文准备几张图,这里我们准备添加home back和menu图标,就需要准备6张图,三张普通状态,三张按下的高亮状态图标:stat_home.pngstat_home_pressed.pngstat_back.pngstat_back_pressed.pngstat_menu.pngstat_men...  阅读全文

posted @ 2011-08-05 15:45 oathleo 阅读(1119) | 评论 (0)编辑 收藏

和奇怪,调试模式下的SAX和script
效率巨慢,而运行模式下,好很多,大概快5-10倍。

另外script包会编译一个print方法,这个过程耗时很多,严重影响效率
去掉并做些优化后
500条脚本,执行从1s缩减到200ms

代码精简如下:
RhinoScriptEngine.java
    Scriptable getRuntimeScope(ScriptContext ctxt) {
        
if (ctxt == null) {
            
throw new NullPointerException("null script context");
        }

        
// we create a scope for the given ScriptContext
        Scriptable newScope = new ExternalScriptable(ctxt, indexedProps);

        
// Set the prototype of newScope to be 'topLevel' so that
        
// JavaScript standard objects are visible from the scope.
        newScope.setPrototype(topLevel);

        
// define "context" variable in the new scope
        newScope.put("context", newScope, ctxt);

        
// define "print", "println" functions in the new scope
        //去掉下面几行
//        Context cx = enterContext();
//        try {
//            cx.evaluateString(newScope, printSource, "print", 1, null);
//        } finally {
//            cx.exit();
//        }
        return newScope;
    }

posted @ 2011-08-03 14:18 oathleo 阅读(1500) | 评论 (0)编辑 收藏

仅列出标题
共17页: First 上一页 4 5 6 7 8 9 10 11 12 下一页 Last