简单实现相册横向滑动功能,用来描述这个对象
分类:巴黎人-服务器

使用Rserve远程执行R脚本,rserver脚本

注1:关于Rserve网上有很多资料可以参考,详细情况可以参考博客下面的“参考资料”部分,本文只是简单介绍一下Rserve,主要目的是记录一下Java远程执行R脚本文件的方法。
注2:这里提到的远程执行R脚本文件的方式都是R脚本存在于Rserve服务端,如果R脚本文件存在客户端,可以使用RUtils工具包:

Rserve介绍

    Rserve是一个基于TCP/IP协议的,允许R语言与其他语言通信的C/S结构的程序,支持C/C++,Java,PHP,Python,Ruby,Nodejs等。 Rserve提供远程连接,认证,文件传输等功能。我们可以设计R做为后台服务,处理统计建模,数据分析,绘图等的任务。
    详细介绍请参照官方网站:https://rforge.net/Rserve/

Rserve安装

Linux系统下建议使用root权限安装。下面的内容是依据Windows7系统中安装过程进行描述的。

进入R语言解释器:R

安装命令:install.packages(“Rserve”)

然后安装程序会提示我们选择下载镜像,提示如下:

— Please select a CRAN mirror for use in this session —

等我们选择了镜像后(测试时选择的是China(xxx)),安装程序便进行下载安装,最终会输出如下的信息(Linux下的输出信息或有不同):

说明Rserve安装成功,安装路径为:%R_HOME%libraryRserve目录。

启动Rserve服务

在Windows命令窗口进入R_HOMElibraryRservelibsi386目录中执行如下命令(我的Windows7是32位的,如果是64位系统对应目录为R_HOMElibraryRservelibsx64):

[plain] view plain copy
R CMD Rserve

R将作出如下应答:

说明Rserve启动成功(端口6311),可以进行连接测试了。

上面的启动命令使用的本地模式,如果想远程连接需要增加参数 –RS-enable-remote

即启动命令为:

[plain] view plain copy
R CMD Rserve –RS-enable-remote

Java远程连接Rserve

下载依赖jar包,地址:
共两个jar包,下载完成后将它们加入到项目的classpath中即可:
 REngine.jar
 RserveEngine.jar
也可以到Rserve安装目录中寻找,比如:R_HOME libraryRservejava目录中就有相关jar包,名字略有不同,经测试可以使用:

简单的测试代码:

[java] view plain copy
package com.zyh.up.general.rjava;

import org.rosuda.REngine.REXPMismatchException;
import org.rosuda.REngine.Rserve.RConnection;
import org.rosuda.REngine.Rserve.RserveException;

public class RserveBegin {
public static void main(String[] args) {
try {
callRserve();
} catch (RserveException e) {
e.printStackTrace();
} catch (REXPMismatchException e) {
e.printStackTrace();
}
}

static void callRserve() throws RserveException, REXPMismatchException {  
    RConnection rConnection = new RConnection("192.168.101.122");  

    String rv = rConnection.eval("R.version.string").asString();  
    System.out.println(rv);  

    double [] arr = rConnection.eval("rnorm(10)").asDoubles();  
    for(double d : arr) {  
        System.out.println(d);  
    }  
}  

}

测试可以通过,程序将输出R语言版本信息及10个Double类型的数字。

Java远程执行R脚本

上面的示例只是执行R命令,但如果我们在服务器上放置R脚本又该如何执行该脚本或调用其中的函数呢?

有两种方法可以完成上面的问题。

假如我们定义了一个R脚本area.R,其中定义了一个方法area,该方法接收一个半径值然后计算对应面积并返回,脚本内容非常简单:

[plain] view plain copy
area<-function(r){pi*r^2}

下面描述一下如何调用这个脚本中的area函数,并获取其返回值。
第一种方法就是直接用source函数将area.R脚本加载上来,然后就可以像调用R语言内置命令/函数一样调用脚本中的area方法了。这样做有一个缺点就是每建立一次Java与R之间的连接就需要调用source函数一次。
示例代码:

[java] view plain copy
package com.zyh.up.general.rjava;

import org.rosuda.REngine.REXP;
import org.rosuda.REngine.REXPMismatchException;
import org.rosuda.REngine.Rserve.RConnection;
import org.rosuda.REngine.Rserve.RserveException;

public class RserveBegin {
public static void main(String[] args) {
try {
callRScript();
} catch (Exception e) {
e.printStackTrace();
}
}

static void callRScript() throws RserveException, REXPMismatchException {  
    RConnection rc = new RConnection("192.168.101.122");  
    // source函数需要给出R脚本路径, 注意传入转义的引号  
    rc.eval("source("/home/hadoop/wangfeng/javaR/area.R")");  

    REXP rexp = rc.eval("area(10)");  
    System.out.println("Area of 10 is " + rexp.asDouble());  
}  

}

代码测试通过。
另一种调用R脚本的方法是通过Rserv.conf配置文件,该文件路径为/etc/Rserv.conf,如果文件不存在则创建一个新的,然后在文件中添加如下的代码:

[plain] view plain copy
source /home/hadoop/wangfeng/javaR/area.R

然后重新启动Rserve服务即可。
使用这种方式Java测试代码需要去掉source语句这一行,即:

[plain] view plain copy
rc.eval(“source(”/home/hadoop/wangfeng/javaR/area.R”)”);

其它不变,经测试成功。

注1:第二种方式只在Linux下采用,Win平台对应的方法没有找到。
另外:有些人说配置文件为Rserve.conf,但我在122的/etc下找到的是Rserv.conf,不管是哪一个文件(甚至两者都不是,随便命名一个),只要执行下面命令告诉Rserve配置文件是哪一个即可(需要重启Rserve):

[plain] view plain copy
R CMD Rserve –RS-conf Rserv.conf

参考资料




查看评论

注1:关于Rserve网上有很多资料可以参考,详细情况可以参考博客下面的“参考资料”部分,本文只是简...

 java之jvm学习笔记六(实践写自己的安全管理器)

完成如下功能:
1)有一个(任意)对象,里面有N个properties以及getter和setter方法
2)有一个properties文件,有N个key,value来描述对象中property的值
3)有一个scheme固定的xml,用来描述这个对象

相信大家用的ListView控件一定很多的,是竖向滑动的,复用convertView,我们可以加载成千上万的数据,但有时候我们会有这个需求 比如相册,我们想横向滑动,并且数据有好多,这时候ViewPager控件就派上用场了,ViewPager使用时候我们需要导入第三方包 android-support-v4.jar包,这是谷歌提供的,这个包里有Fragment ViewPager等控件,用户导入这个包,在3.0以前就可以使用Fragment控件了~

转载:

 

要求写一个解析器:
1)将xml中的占位符,替换为properties文件中的value
2) 将xml解析成对象,调用getter方法的时候可以获得值
3)用面向对象的思想,使该解析器有扩展性

下面就开始讲下ViewPager的用 法,ViewPager和ViewFlipper用法类似,但是更好用,左右滑动效果好,而且有类似于ListView的Adapter--- PagerAdapter基类,这样的话可以回收内存,复用等。PagerAdapter的几个方法里常用的有:

 

                安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessController的checkPerssiom方法,访问控制器AccessController的栈检查机制又遍历整个 PerssiomCollection来判断具体拥有什么权限一旦发现栈中一个权限不允许的时候抛出异常否则简单的返回,这个过程实际上比我的描述要复杂 得多,这里我只是简单的一句带过,因为这里涉及到很多比较后面的知识点。

例子见附件,注意:
1)对象是任意对象,不是例子中的Student,对象中的property都是Java中的原生类型
2)xml和properties在使用的时候都是根据对象配置好的
3) xml的scheme是固定的,就是附件中的scheme

[java] view plaincopy

Java RMI 指的是远程方法调用 (Remote Method Invocation)。它是一种机制,能够让在某个 Java 虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法。可以用此方法调用的任何对象必须实现该远程接口。

                下面来尝试一下写一个非常简单的demo,旨在让你有一个比较形象的思维,不会在概念上打转。

import java.util.Date;

/**
 * Created by IntelliJ IDEA.
 * User: liuzz
 * Date: 13-11-2
 * Time: 下午11:53
 */
public class Student {

    private String name;

    private int age;

    private Date birth;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Date getBirth() {
        return birth;
    }

    public void setBirth(Date birth) {
        this.birth = birth;
    }
    public String toString(){
        return "[ name = " + name +" , age = "+age+" , birth = " + birth+"]";
    }
}
  1. void destroyItem(View container, int position, Object object)   
  2.   
  3. 这里是左右滑动的时候,回收较早前的itemView.  

 

                第一步,定义一个类继承自SecurityManger重写它的checkRead方(如果你有兴趣可以先跳到super.checkRead(file, context);看看,当然不看也没有关系,我们后面的章节会基于这个demo做扩展的时候也会讲到)。

object.properties2文件

[java] view plaincopy

Java RMI不是什么新技术(在Java1.1的时代都有了),但却是是非常重要的底层技术。

              

name=a  
age=10  
birth=2003-11-04 
  1. int getCount()   
  2. ViewPager里显示内容的条数.  

大名鼎鼎的EJB都是建立在rmi基础之上的,现在还有一些开源的远程调用组件,其底层技术也是rmi。

[java] view plaincopy

object.xml文件

[java] view plaincopy

 

  1. package com.yfq.test;  
  2.   
  3. public class MySecurityManager extends SecurityManager {  
  4.   
  5.     @Override  
  6.     public void checkRead(String file) {  
  7.         //super.checkRead(file, context);  
  8.         if (file.endsWith("test"))    
  9.         throw new SecurityException("你没有读取的本文件的权限");    
  10.     }  
  11.       
  12. }  
<object class="MyTest.MyTest.Week2.Student">  
    <property name="name">  
        <value>${name}</value>  
    </property>  
    <property name="age">  
        <value>${age}</value>  
    </property>  
    <property name="birth">  
        <value>${birth}</value>  
    </property>  
</object>  
  1. Object instantiateItem(View container, int position)  
  2. 始化ItemView.  

在大力鼓吹Web Service、SOA的时代,是不是每个应用都应该选用笨拙的Web Service组件来实现,通过对比测试后,RMI是最简单的,在一些小的应用中是最合适的。

                第二步,定义一个有main函数的public类来验证自己的安全管理器是不是器作用了。

代码实现:

为 了让大家容易掌握,我写了一个简单的例子,简单实现相册横向滑动功能,首先自定义了ViewPager的itemView---- ViewPagerItemView,这里做了初始化View的定义,以及回收内存重新加载等,数据源是JSONObject.其次是实现了 PagerAdapter的适配器ViewPagerAdater,这里的数据源是JSONArray.然后ViewPager在名为 ViewPagerDemoActivity.java的Activity里显示。下面是具体实现步骤:

 

[java] view plaincopy

import java.io.BufferedReader;  
import java.io.File;  
import java.io.FileInputStream;  
import java.io.FileNotFoundException;  
import java.io.IOException;  
import java.io.InputStream;  
import java.lang.reflect.AnnotatedType;  
import java.lang.reflect.Field;  
import java.sql.Date;  
import java.text.ParseException;  
import java.text.SimpleDateFormat;  
import java.util.Iterator;  
import java.util.List;  
import java.util.Properties;  
import java.util.Scanner;  

import javax.xml.parsers.DocumentBuilder;  
import javax.xml.parsers.DocumentBuilderFactory;  
import javax.xml.parsers.ParserConfigurationException;  

import org.jdom.Document;  
import org.jdom.Element;  
import org.jdom.JDOMException;  
import org.jdom.input.SAXBuilder;  
import org.w3c.dom.Node;  
import org.w3c.dom.NodeList;  
import org.xml.sax.SAXException;  

import com.google.common.io.Files;  

public class RecoverObject<O> {  
    private String propertiesFile;  
    private String objectXmlFile;  
    private String recoverObjextXmlFile;  
    private String clazzName;  
    private Properties properties;  
    public RecoverObject(String propertiesFile, String objectXmlFile){  
        this.propertiesFile = propertiesFile;  
        this.objectXmlFile = objectXmlFile;  
        this.recoverObjextXmlFile = this.objectXmlFile+".recover";  

        this.properties = new Properties();  
        initObject();  
    }  
    private void processXmlFile(String context){  
        int pre = -1, s = -1, e = -1;  
        StringBuffer buffer = new StringBuffer();  
        while((s = context.indexOf("${", pre+1))!=-1){  
            e = context.indexOf("}", s + 2);  
            buffer.append(context.substring(pre+1, s));  
            String attr = context.substring(s+2, e);  
            buffer.append(this.properties.get(attr));  
            pre = e;  
        }  
        buffer.append(context.substring(pre+1));  
        try {  
            Files.write(buffer.toString().getBytes(), new File(this.recoverObjextXmlFile));  
        } catch (IOException e1) {  
            // TODO Auto-generated catch block  
            e1.printStackTrace();  
        }  

    }  
    private void initObject(){  
        FileInputStream in;  
        try {  
            in = new FileInputStream(new File(this.propertiesFile));  
            this.properties.load(in);  
            in.close();  
        } catch (FileNotFoundException e) {  
            e.printStackTrace();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }   
        StringBuffer buffer = new StringBuffer();  
        try {  
            Scanner scan = new Scanner(new FileInputStream(new File(this.objectXmlFile)));  
            while(scan.hasNextLine()){  
                buffer.append(scan.nextLine());  
                buffer.append("n");  
            }  
        } catch (FileNotFoundException e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        }  
        String context = buffer.toString();  
        this.processXmlFile(context);  

    }  

    public O get(){  
        SAXBuilder builder=new SAXBuilder(false);  
        Class<?> demo=null;  
        try {  
            Document doc=builder.build(this.recoverObjextXmlFile);  
            Element object=doc.getRootElement();  
            this.clazzName = object.getAttributeValue("class");  
            demo=Class.forName(this.clazzName);  
            O o = (O) demo.newInstance();  
            List propertiesList = object.getChildren("property");  
            for(Iterator iter = propertiesList.iterator(); iter.hasNext();){  
                Element attr = (Element) iter.next();  
                String attrName = attr.getAttributeValue("name");  
                String attrValue = attr.getChildText("value");  
                Field f= demo.getDeclaredField(attrName);  
                f.setAccessible(true);  
                Class<?> type = f.getType();  
                if(type.equals(String.class)){  
                    f.set(o, attrValue);  
                }else if(type.equals(int.class)){  
                    f.set(o, Integer.parseInt(attrValue));  
                }else if(type.equals(java.util.Date.class)){  
                    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");  
                    f.set(o, format.parse(attrValue));  
                }  

            }  
            return o;  
        } catch (JDOMException e) {  

            e.printStackTrace();  
        } catch (IOException e) {  

            e.printStackTrace();  
        } catch (ClassNotFoundException e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        } catch (InstantiationException e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        } catch (IllegalAccessException e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        } catch (NoSuchFieldException e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        } catch (SecurityException e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        } catch (IllegalArgumentException e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        } catch (ParseException e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        }  

        return null;  
    }  
    public static void main(String [] args){  
        RecoverObject<Student> object = new RecoverObject<Student>("./source/object.properties2", "./source/object.xml");  
        Student s = object.get();  
        System.out.println(s);  
    }  
} 

第一步:新建一个Android工程ViewPagerDemoActivity,目录结构如下图所示:

下面通过一个简单的例子来说明RMI的原理和应用,下面这个例子是一个简单HelloWorld,但已涵盖RMI的核心应用与开发模式。

  1. package com.yfq.test;  
  2.   
  3. import java.io.FileInputStream;  
  4. import java.io.IOException;  
  5.   
  6. public class TestMySecurityManager {  
  7.     public static void main(String[] args) {  
  8.         System.setSecurityManager(new MySecurityManager());  
  9.         try {  
  10.             FileInputStream fis = new FileInputStream("test");  
  11.             System.out.println(fis.read());  
  12.         } catch (IOException e) {  
  13.             e.printStackTrace();  
  14.         }  
  15.   
  16.     }  
  17. }  

 

图片 1

 

                  第三步,运行代码查看控制台输出

完成如下功能:
1)有一个(任意)对象,里面有N个properties以及getter和setter方法
2)有一个properties文件,有N个key,value来描述对象中property的值
3)有一个scheme固定的xml,用来描述这个对象

第二步:新建一个ViewPagerItemView.java这里是相册的ItemView,代码如下:

/** 
* Created by IntelliJ IDEA. 
* User: leizhimin 
* Date: 2008-8-7 21:50:02 
* 定义一个远程接口,必须继承Remote接口,其中需要远程调用的方法必须抛出RemoteException异常 
*/ 
public interface IHello extends Remote { 

Exception in thread "main" java.lang.SecurityException: 你没有读取的本文件的权限
 at com.yfq.test.MySecurityManager.checkRead(MySecurityManager.java:9)
 at java.io.FileInputStream.<init>(FileInputStream.java:100)
 at java.io.FileInputStream.<init>(FileInputStream.java:66)
 at com.yfq.test.TestMySecurityManager.main(TestMySecurityManager.java:10)

要求写一个解析器:
1)将xml中的占位符,替换为properties文件中的value
2) 将xml解析成对象,调用getter方法的时候可以获得值
3)用面向对象的思想,使该解析器有扩展性

[java] view plaincopy

    /** 
     * 简单的返回“Hello World!"字样 
     * @return 返回“Hello World!"字样 
     * @throws java.rmi.RemoteException 
     */ 
    public String helloWorld() throws RemoteException; 

 从上面的异常我们发现,安全管理器起作用了。读过笔记四的人应该会发现,这里我们用到 了一个笔记四提到的方法:System.setSecurityManager(new MySecurityManager());这个是安装安全管理器的另外一种方法,笔记四中我们曾经用-Djava.security.manager安 装过默认的安全管理器,有印象不?

例子见附件,注意:
1)对象是任意对象,不是例子中的Student,对象中的property都是Java中的原生类型
2)xml和properties在使用的时候都是根据对象配置好的
3) xml的scheme是固定的,就是附件中的scheme

  1. package com.tutor.viewpager;  
  2.   
  3. import org.json.JSONException;  
  4. import org.json.JSONObject;  
  5.   
  6. import android.content.Context;  
  7. import android.graphics.Bitmap;  
  8. import android.util.AttributeSet;  
  9. import android.view.LayoutInflater;  
  10. import android.view.View;  
  11. import android.widget.FrameLayout;  
  12. import android.widget.ImageView;  
  13. import android.widget.TextView;  
  14.   
  15. /** 
  16.  * @author frankiewei 
  17.  * 相册的ItemView,自定义View.方便复用. 
  18.  */  
  19. public class ViewPagerItemView extends FrameLayout {  
  20.   
  21.     /** 
  22.      * 图片的ImageView. 
  23.      */  
  24.     private ImageView mAlbumImageView;  
  25.       
  26.     /** 
  27.      * 图片名字的TextView. 
  28.      */  
  29.     private TextView mALbumNameTextView;  
  30.       
  31.     /** 
  32.      * 图片的Bitmap. 
  33.      */  
  34.     private Bitmap mBitmap;  
  35.       
  36.     /** 
  37.      * 要显示图片的JSONOBject类. 
  38.      */  
  39.     private JSONObject mObject;  
  40.       
  41.       
  42.     public ViewPagerItemView(Context context){  
  43.         super(context);  
  44.         setupViews();  
  45.     }  
  46.       
  47.     public ViewPagerItemView(Context context, AttributeSet attrs) {  
  48.         super(context, attrs);  
  49.         setupViews();  
  50.     }  
  51.       
  52.     //初始化View.  
  53.     private void setupViews(){  
  54.         LayoutInflater inflater = LayoutInflater.from(getContext());  
  55.         View view = inflater.inflate(R.layout.viewpager_itemview, null);  
  56.           
  57.         mAlbumImageView = (ImageView)view.findViewById(R.id.album_imgview);  
  58.         mALbumNameTextView = (TextView)view.findViewById(R.id.album_name);   
  59.         addView(view);  
  60.     }  
  61.   
  62.     /** 
  63.      * 填充数据,共外部调用. 
  64.      * @param object 
  65.      */  
  66.     public void setData(JSONObject object){  
  67.         this.mObject = object;  
  68.         try {  
  69.             int resId = object.getInt("resid");  
  70.             String name = object.getString("name");  
  71.             //实战中如果图片耗时应该令其一个线程去拉图片异步,不然把UI线程卡死.  
  72.             mAlbumImageView.setImageResource(resId);  
  73.             mALbumNameTextView.setText(name);  
  74.         } catch (JSONException e) {  
  75.             e.printStackTrace();  
  76.         }  
  77.           
  78.     }  
  79.           
  80.     /** 
  81.      * 这里内存回收.外部调用. 
  82.      */  
  83.     public void recycle(){  
  84.         mAlbumImageView.setImageBitmap(null);  
  85.         if ((this.mBitmap == null) || (this.mBitmap.isRecycled()))  
  86.             return;  
  87.         this.mBitmap.recycle();  
  88.         this.mBitmap = null;  
  89.     }  
  90.       
  91.       
  92.     /** 
  93.      * 重新加载.外部调用. 
  94.      */  
  95.     public void reload(){  
  96.         try {  
  97.             int resId = mObject.getInt("resid");  
  98.             //实战中如果图片耗时应该令其一个线程去拉图片异步,不然把UI线程卡死.  
  99.             mAlbumImageView.setImageResource(resId);  
  100.         }catch (JSONException e) {  
  101.             e.printStackTrace();  
  102.         }  
  103.     }  
  104.       
  105. }  

    /** 
     * 一个简单的业务方法,根据传入的人名返回相应的问候语 
     * @param someBodyName  人名 
     * @return 返回相应的问候语 
     * @throws java.rmi.RemoteException 
     */ 
    public String sayHelloToSomeBody(String someBodyName) throws RemoteException; 
}

 

 

其中ViewPagerItemView使用的xml文件viewpager_itemView.xml代码如下:

 

拓展内容

Student.java文件

[java] view plaincopy

/** 
* Created by IntelliJ IDEA. 
* User: leizhimin 
* Date: 2008-8-7 21:56:47 
* 远程的接口的实现 
*/ 
public class HelloImpl extends UnicastRemoteObject implements IHello { 
    /** 
     * 因为UnicastRemoteObject的构造方法抛出了RemoteException异常,因此这里默认的构造方法必须写,必须声明抛出RemoteException异常 
     * 
     * @throws RemoteException 
     */ 
    public HelloImpl() throws RemoteException { 
    } 

好了,我们的安全管理器是怎么被执行的呢?如果你有兴趣可以继续往下看一下,也可以跳过,这里只是简单的介绍一下,也是本人习惯的学习思路

 

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <FrameLayout xmlns:android=""  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent"  
  5.     >  
  6.       
  7.     <ImageView   
  8.         android:id="@+id/album_imgview"  
  9.         android:layout_width="fill_parent"  
  10.         android:layout_height="fill_parent"  
  11.         android:contentDescription="@string/app_name"  
  12.         android:scaleType="fitXY"  
  13.         />  
  14.       
  15.     <TextView  
  16.         android:id="@+id/album_name"  
  17.         android:layout_width="wrap_content"  
  18.         android:layout_height="wrap_content"  
  19.         android:layout_gravity="bottom|center_horizontal"   
  20.         android:textColor="#B2191919"  
  21.         />  
  22. </FrameLayout>  

    /** 
     * 简单的返回“Hello World!"字样 
     * 
     * @return 返回“Hello World!"字样 
     * @throws java.rmi.RemoteException 
     */ 
    public String helloWorld() throws RemoteException { 
        return "Hello World!"; 
    } 

直接跳到FileInputStream的构造函数里,下面贴出代码,简单阅读一下

[java] view plain copy

第三步:新建一个ViewPagerAdapter.java继承与PagerAdapter,代码如下:

    /** 
     * 一个简单的业务方法,根据传入的人名返回相应的问候语 
     * 
     * @param someBodyName 人名 
     * @return 返回相应的问候语 
     * @throws java.rmi.RemoteException 
     */ 
    public String sayHelloToSomeBody(String someBodyName) throws RemoteException { 
        return "你好," + someBodyName + "!"; 
    } 
}

[java] view plaincopy

 

[java] view plaincopy

 

  1. public FileInputStream(File file) throws FileNotFoundException {  
  2. String name = (file != null ? file.getPath() : null);  
  3. SecurityManager security = System.getSecurityManager();  
  4. if (security != null) {  
  5.     security.checkRead(name);  
  6. }  
  7.        if (name == null) {  
  8.            throw new NullPointerException();  
  9.        }  
  10. fd = new FileDescriptor();  
  11. open(name);  
  12.    }  
  1. import java.util.Date;  
  2.   
  3. /** 
  4.  * Created by IntelliJ IDEA. 
  5.  * User: liuzz 
  6.  * Date: 13-11-2 
  7.  * Time: 下午11:53 
  8.  */  
  9. public class Student {  
  10.   
  11.     private String name;  
  12.   
  13.     private int age;  
  14.   
  15.     private Date birth;  
  16.   
  17.     public String getName() {  
  18.         return name;  
  19.     }  
  20.   
  21.     public void setName(String name) {  
  22.         this.name = name;  
  23.     }  
  24.   
  25.     public int getAge() {  
  26.         return age;  
  27.     }  
  28.   
  29.     public void setAge(int age) {  
  30.         this.age = age;  
  31.     }  
  32.   
  33.     public Date getBirth() {  
  34.         return birth;  
  35.     }  
  36.   
  37.     public void setBirth(Date birth) {  
  38.         this.birth = birth;  
  39.     }  
  40.     public String toString(){  
  41.         return "[ name = " + name +" , age = "+age+" , birth = " + birth+"]";  
  42.     }  
  43. }  
  1. package com.tutor.viewpager;  
  2.   
  3. import java.util.HashMap;  
  4.   
  5. import org.json.JSONArray;  
  6. import org.json.JSONException;  
  7. import org.json.JSONObject;  
  8.   
  9. import android.content.Context;  
  10. import android.os.Parcelable;  
  11. import android.support.v4.view.PagerAdapter;  
  12. import android.support.v4.view.ViewPager;  
  13. import android.view.View;  
  14.   
  15. /** 
  16.  * @author frankiewei 
  17.  * 相册的适配器. 
  18.  */  
  19. public class ViewPagerAdapter extends PagerAdapter {  
  20.   
  21.     /** 
  22.      * 上下文 
  23.      */  
  24.     private Context mContext;  
  25.       
  26.     /** 
  27.      * 数据源,这里是JSONARRAY 
  28.      */  
  29.     private JSONArray mJsonArray;  
  30.       
  31.     /** 
  32.      * Hashmap保存相片的位置以及ItemView. 
  33.      */  
  34.     private HashMap<Integer, ViewPagerItemView> mHashMap;  
  35.       
  36.     public ViewPagerAdapter(Context context,JSONArray arrays) {  
  37.         this.mContext = context;  
  38.         this.mJsonArray = arrays;  
  39.         mHashMap = new HashMap<Integer, ViewPagerItemView>();  
  40.     }  
  41.       
  42.     //这里进行回收,当我们左右滑动的时候,会把早期的图片回收掉.  
  43.     @Override  
  44.     public void destroyItem(View container, int position, Object object) {  
  45.         ViewPagerItemView itemView = (ViewPagerItemView)object;  
  46.         itemView.recycle();  
  47.     }  
  48.       
  49.     @Override  
  50.     public void finishUpdate(View view) {  
  51.   
  52.     }  
  53.   
  54.     //这里返回相册有多少条,和BaseAdapter一样.  
  55.     @Override  
  56.     public int getCount() {  
  57.         return mJsonArray.length();  
  58.     }  
  59.   
  60.     //这里就是初始化ViewPagerItemView.如果ViewPagerItemView已经存在,  
  61.     //重新reload,不存在new一个并且填充数据.  
  62.     @Override  
  63.     public Object instantiateItem(View container, int position) {     
  64.         ViewPagerItemView itemView;  
  65.         if(mHashMap.containsKey(position)){  
  66.             itemView = mHashMap.get(position);  
  67.             itemView.reload();  
  68.         }else{  
  69.             itemView = new ViewPagerItemView(mContext);  
  70.             try {  
  71.                 JSONObject dataObj = (JSONObject) mJsonArray.get(position);  
  72.                 itemView.setData(dataObj);  
  73.             } catch (JSONException e) {  
  74.                 e.printStackTrace();  
  75.             }  
  76.             mHashMap.put(position, itemView);  
  77.             ((ViewPager) container).addView(itemView);  
  78.         }  
  79.           
  80.         return itemView;  
  81.     }  
  82.   
  83.     @Override  
  84.     public boolean isViewFromObject(View view, Object object) {  
  85.         return view == object;  
  86.     }  
  87.   
  88.     @Override  
  89.     public void restoreState(Parcelable arg0, ClassLoader arg1) {  
  90.           
  91.     }  
  92.   
  93.     @Override  
  94.     public Parcelable saveState() {  
  95.         return null;  
  96.     }  
  97.   
  98.     @Override  
  99.     public void startUpdate(View view) {  
  100.   
  101.     }  
  102. }  

/** 
* Created by IntelliJ IDEA. 
* User: leizhimin 
* Date: 2008-8-7 22:03:35 
* 创建RMI注册表,启动RMI服务,并将远程对象注册到RMI注册表中。 
*/ 
public class HelloServer { 
    public static void main(String args[]) { 

发现没?它首先执行SecurityManager security = System.getSecurityManager();,然后再调用security的checkRead方法,就是这么简单。

object.properties2文件

第四步:修改主Activity类ViewPagerDemoActivity.java代码如下:

        try { 
            //创建一个远程对象 
            IHello rhello = new HelloImpl(); 
            //本地主机上的远程对象注册表Registry的实例,并指定端口为8888,这一步必不可少(Java默认端口是1099),必不可缺的一步,缺少注册表创建,则无法绑定对象到远程注册表上 
            LocateRegistry.createRegistry(8888); 

 

 

[java] view plaincopy

            //把远程对象注册到RMI注册服务器上,并命名为RHello 
            //绑定的URL标准格式为:rmi://host:port/name(其中协议名可以省略,下面两种写法都是正确的) 
            Naming.bind("rmi://localhost:8888/RHello",rhello); 
//            Naming.bind("//localhost:8888/RHello",rhello); 

如果你还有兴趣那么继续往下读,在使用java的File时,你是否用过setWritable(boolean, boolean),让你可以指定创建文件的权限,学习了安全管理器之后你有没有有豁然开朗的感觉,它是怎么实现的,相信你已经猜到了,没有错就是安全管理 器设置权限啦。下面贴出它的代码,同时也引入一个新的概念Permission

 

  1. package com.tutor.viewpager;  
  2.   
  3. import org.json.JSONArray;  
  4. import org.json.JSONException;  
  5. import org.json.JSONObject;  
  6.   
  7. import android.app.Activity;  
  8. import android.os.Bundle;  
  9. import android.support.v4.view.ViewPager;  
  10.   
  11. /** 
  12.  * @author frankiewei 
  13.  * ViewPager控件使用的Demo. 
  14.  */  
  15. public class ViewPagerDemoActivity extends Activity {  
  16.       
  17.     /** 
  18.      * 这里定义了相册的总数100条. 
  19.      */  
  20.     private static final int ALBUM_COUNT = 100;  
  21.       
  22.     /** 
  23.      * 相册的资源,实战开发中都是网络数据或者本地相册. 
  24.      */  
  25.     private static final int ALBUM_RES[] = {  
  26.         R.drawable.test1,R.drawable.test2,R.drawable.test3,  
  27.         R.drawable.test4,R.drawable.test5,R.drawable.test6  
  28.     };  
  29.       
  30.     private ViewPager mViewPager;  
  31.       
  32.     /** 
  33.      * 适配器. 
  34.      */  
  35.     private ViewPagerAdapter mViewPagerAdapter;  
  36.       
  37.     /** 
  38.      * 数据源. 
  39.      */  
  40.     private JSONArray mJsonArray;  
  41.       
  42.       
  43.     @Override  
  44.     public void onCreate(Bundle savedInstanceState) {  
  45.         super.onCreate(savedInstanceState);  
  46.         setContentView(R.layout.main);  
  47.           
  48.         setupViews();  
  49.     }  
  50.       
  51.     private void setupViews(){      
  52.         //初始化JSonArray,给ViewPageAdapter提供数据源用.  
  53.         mJsonArray = new JSONArray();  
  54.         for(int i = 0;i<ALBUM_COUNT; i++){  
  55.             JSONObject object = new JSONObject();  
  56.             try {  
  57.                 object.put("resid", ALBUM_RES[i % ALBUM_RES.length]);  
  58.                 object.put("name", "Album " + i);  
  59.                 mJsonArray.put(object);  
  60.             } catch (JSONException e) {  
  61.                 e.printStackTrace();  
  62.             }  
  63.               
  64.         }         
  65.         mViewPager = (ViewPager)findViewById(R.id.viewpager);  
  66.         mViewPagerAdapter = new ViewPagerAdapter(this, mJsonArray);  
  67.         mViewPager.setAdapter(mViewPagerAdapter);  
  68.     }  
  69. }  

            System.out.println(">>>>>INFO:远程IHello对象绑定成功!"); 
        } catch (RemoteException e) { 
            System.out.println("创建远程对象发生异常!"); 
            e.printStackTrace(); 
        } catch (AlreadyBoundException e) { 
            System.out.println("发生重复绑定对象异常!"); 
            e.printStackTrace(); 
        } catch (MalformedURLException e) { 
            System.out.println("发生URL畸形异常!"); 
            e.printStackTrace(); 
        } 
    } 
}

[java] view plaincopy

[plain] view plain copy

其中main.xml布局代码如下:

 

  1.    public boolean setWritable(boolean writable, boolean ownerOnly) {  
  2. SecurityManager security = System.getSecurityManager();  
  3. if (security != null) {  
  4.     security.checkWrite(path);  
  5. }  
  6. return fs.setPermission(this, FileSystem.ACCESS_WRITE, writable, ownerOnly);  
  7.    }  

 

[java] view plaincopy

/** 
* Created by IntelliJ IDEA. 
* User: leizhimin 
* Date: 2008-8-7 22:21:07 
* 客户端测试,在客户端调用远程对象上的远程方法,并返回结果。 
*/ 
public class HelloClient { 
    public static void main(String args[]){ 
        try { 
            //在RMI服务注册表中查找名称为RHello的对象,并调用其上的方法 
            IHello rhello =(IHello) Naming.lookup("rmi://localhost:8888/RHello"); 
            System.out.println(rhello.helloWorld()); 
            System.out.println(rhello.sayHelloToSomeBody("熔岩")); 
        } catch (NotBoundException e) { 
            e.printStackTrace(); 
        } catch (MalformedURLException e) { 
            e.printStackTrace(); 
        } catch (RemoteException e) { 
            e.printStackTrace();   
        } 
    } 
}

Permisson就是权限的意思,它仅仅取出安全管理器然后将文件的权限设置了一下而已,这个也是后面所有关于权限的一个不可或缺的类!

  1. name=a  
  2. age=10  
  3. birth=2003-11-04  
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android=""  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent"  
  5.     android:orientation="vertical" >  
  6.   
  7.     <android.support.v4.view.ViewPager  
  8.         android:id="@+id/viewpager"  
  9.         android:layout_width="fill_parent"  
  10.         android:layout_height="fill_parent"  
  11.          />  
  12.   
  13. </LinearLayout> 

 

好了今天的文件安全管理器demo就到这里。意在浅显易懂!

 

运行RMI服务端程序:

 

 

图片 2

 java之jvm学习笔记七(jar包的代码认证和签名)

object.xml文件

 

 

 

运行RMI客户端程序:

本文由巴黎人手机版发布于巴黎人-服务器,转载请注明出处:简单实现相册横向滑动功能,用来描述这个对象

上一篇:没有了 下一篇:使用方式,3  查找指定文件
猜你喜欢
热门排行
精彩图文