banxitan

统计

留言簿(2)

阅读排行榜

评论排行榜

2012年9月17日 #

Android Activity MainThread 中不能执行http通信解决办法

今天在做离线文件传输时。用HTTP上传文件。程序一运行 报如下的错误
android.os.NetworkOnMainThreadException

原因是Google从3开始,强制默认禁止UI主线程发起通信请求 

解决办法: 

把通信的代码转移到子线程里去做, 比较靠谱的是new一个AyncTask,在里面做通信

                          有几个细节性的问题是,

                                第一, 一般原有通信的代码都是共通的API, 被许多个Activity调用, 一个良好的修改方法是在共通API里面new AyncTask

                               第二, 通信的API一般来说都是同步的, 你通信,然后画面主线程需要堵塞住,等待API的通信结果,再决定下面的业务逻辑的走向。

所以,这块可以采取 AyncTask.get(), 让主线程堵塞,直到通信结束。 当然,如果你需要将通信异步的话, 可以用Handler机制来解决


具体调用代码如下:HTTP异

步请求

package com.qqtech.ucstar.utils;

import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntity;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.impl.client.DefaultHttpClient;

import android.os.AsyncTask;

public class HttpReqTask extends AsyncTask<Object, Object, HttpResponse> {

@Override
protected HttpResponse doInBackground(Object arg0) {
String fileUploadUrl
= (String) arg0[0];
String streamid
= (String) arg0[1];
File file
= (File) arg0[2];
//boolean paramBoolean = Boolean.parseBoolean((String) arg0[3]);
//String paramString3 = (String) arg0[4];
HttpClient localHttpClient = new DefaultHttpClient();
//String str1 = "fileName";
File localFile = file;
try {
if ((localFile == null) || (!localFile.exists()))
throw new IOException("文件不存在:" + localFile);
}
catch (IOException e1) {
e1.printStackTrace();
}

HttpPost localPostMethod
= new HttpPost(fileUploadUrl+"?streamid="+streamid+"&fileencode=UTF-8");
//MultipartEntity reqEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
MultipartEntity reqEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE,null, Charset.forName("UTF-8"));
try {
FileBody bin
= new FileBody(file);
reqEntity.addPart(
"file", bin);
localPostMethod.setEntity(reqEntity);
HttpResponse response
= localHttpClient.execute(localPostMethod);
return response;
}
catch (Exception e) {
e.printStackTrace();
}

return null;
}


}



调用代码如下:


Object[] param = new Object[5];
     param[0] = answer.getUploadURL();
     param[1] = answer.getStreamid();
     param[2] = new File(answer.getFileURL());
     param[3] = "false";
     param[4] = "";
     AsyncTask res = new HttpReqTask().execute(param);
     HttpResponse rep = null;
     rep = (HttpResponse) res.get();
     if (rep.getStatusLine().getStatusCode() == 200) {
      System.out.println("文件上传成功");
     }else{
      System.out.println("文件上传失败");
     }
    }



posted @ 2013-07-11 10:51 MikyTan 阅读(1081) | 评论 (0)编辑 收藏

修改模拟器DNS方法

今天在做手机终端开发时,发现连上域名服务器老是连不上,而直接用IP连接是OK的,初步怀凝是DNS问题引起来,经查相关的资料,现记录如下:

Android模拟器默认的地址是10.0.2.3,默认的DNS也是10.0.2.3,而一般电脑的IP都是192.168.1.100之类的,不在同一个网段。所以就会出现电脑可以上网但是模拟器不能上网的情况。其实设置方法很简单,只要把模拟器的默认DNS设置成电脑的DNS地址即可。
第一步:用系统的命令进入Android开发包的tools目录
 cd X:\...\android-sdk-windows\tool
第二布:使用adb的shell,确认系统的各项属性
adb shell
getprop 
getprop会列出系统当前的各项属性
第三步:得到模拟器的DNS地址
在结果里可以看到:
[net.dns1]: [10.0.2.3]
[net.dns2]: [10.0.2.4]
[net.dns3]: [10.0.2.5]
[net.dns4]: [10.0.2.6]
第四步:把dns改成我们自己的DNS
setprop net.dns1 192.168.1.1

posted @ 2013-06-04 20:24 MikyTan 阅读(1265) | 评论 (0)编辑 收藏

JAVA 连接 ORCLE RAC连接URL串

连接的URL串

jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=vip1)(PORT

=1521))(ADDRESS=(PROTOCOL=TCP)(HOST=vip2)(PORT=1521))(LOAD_BALANCE=yes)(FAILOVER=

on))(CONNECT_DATA=(SERVICE_NAME=gs)))


posted @ 2013-05-21 16:48 MikyTan 阅读(246) | 评论 (0)编辑 收藏

Oralce 监听器启动


啟動      lsnrctl start
狀態      lsnrctl status
關閉      lsnrctl  stop

posted @ 2013-05-11 14:47 MikyTan 阅读(175) | 评论 (0)编辑 收藏

Oracle 导出、导入某用户所有数据(包括表、视图、存储过程...)


导出命令:exp 用户名/密码@数据库 owner=用户名 file=文件存储路径(如:F:\abcd.dmp)

测试截图:exp ZM/sql123@ORCL owner=ZM file=F\abcd.dmp



导入命令:imp 用户名/密码@数据库 fromuser=用户名 touser=用户名 file=d:\cu.dmp ignore=y

 imp:命令类型  

cu/mycu@db:导入的数据库登陆(用户名/密码@数据库)  

fromuser:文件的指定用户

 touser:指定导入到当前登录的数据库某个用户  

file:需要导入的数据文件  

ignore:是否忽略创建错误

 

测试截图:

imp ZM/sql123@ORCL fromuser=ZM touser=SZZM file=F:\test.dmp ignore=y





posted @ 2013-05-11 09:59 MikyTan 阅读(386) | 评论 (0)编辑 收藏

linux环境下的rmi常见问题

linux环境下的rmi常见问题

问题一:RMI服务提供程序运行在Windows操作系统下,RMI服务可以正常访问,但将RMI服务提供程序部署到Linux操作系统下后,RMI服务无法访问,提示

org.springframework.remoting.RemoteConnectFailureException:

Cannot connect to remote service [rmi://192.168.0.106:1199/ItemRetag]; nested exception is java.rmi.ConnectException: Connection refused to host: 127.0.0.1; ……   
 解决办法:在加载RMI服务之前将当前服务器的IP指定给hostName,如 System.setProperty("java.rmi.server.hostname", "192.168.100.7");或者修改/etc/hosts文件,在这个文件中加 192.168.100.54  testlinux1 localhost.localdomain localhost 就行,或者将/etc/hosts文件中默认的127.0.0.1改成当前机器的IP即可!

问题二:java.rmi.server.ExportException: internal error: ObjID already in use Caused by: java.rmi.server.ExportException: internal error: ObjID already in use……

出现这种问题及有可能是/etc/hosts文件中指定的IP并不是当前服务器的真实IP,RMI在初始化时注册服务失败。

通过System.out.println(InetAddress.getLocalHost().toString());查看当前主机的IP是否为真实IP,如显示为SIMBANK/220.250.64.24,而真实IP为192.168.1.2         

解决办法:修改/etc/hosts文件中错误的IP即可,将:

220.250.64.24          SIMBANK
修改为

192.168.1.2          SIMBANK

posted @ 2013-05-08 20:26 MikyTan 阅读(3770) | 评论 (0)编辑 收藏

IBM JDK 、SUN JDK、HP JDK如何产生Heapdump文件

JAVA中,通过分析Heapdump文件可以检查程序是否存在内存泄露,但是这个文件一般是在程序遇到致命问题时才会产生,而如何事前生成这个文件,从而在程序尚末崩溃前找出问题的所在。

以下记述了各个版本的JDK产生DUMP文件的方法:

UN JDK生成Heapdump文件只需要在tomcat启动脚本中增加 HeapDumpOnOutOfMemoryError 参数
此参数需要Java SE release 5.0 update 14 或以上支持

设置示例:
set JAVA_OPTS=%JAVA_OPTS% -server -Xms512m -Xmx800m -XX:PermSize=64M -XX:MaxPermSize=128m -Djava.awt.headless=true -XX:+HeapDumpOnOutOfMemoryError -XX:+HeapDumpOnCtrlBreak

IBM JDK生成Heapdump文件的开关:
— export IBM_HEAPDUMP=true
— export IBM_HEAP_DUMP=true
— export IBM_HEAPDUMP_OUTOFMEMORY=true
— export IBM_JAVADUMP_OUTOFMEMORY=true
— export IBM_JAVACORE_OUTOFMEMORY=true
— export IBM_HEAPDUMPDIR=<directory_path>

HP JDK生成Heapdump文件需要在在环境变量上,加上export _JAVA_HEAPDUMP=1

posted @ 2013-03-26 16:03 MikyTan 阅读(1087) | 评论 (0)编辑 收藏

MySql 的批量操作,要加rewriteBatchedStatements参数

今天在做某项目的POC测试,甲方提供了一个三十万记录的TXT数据文件,需要把该文件的记录插入到数据库中,由于项目部的同事在搭建测试环境中用的是Mysql数据库,在把数据导入到数据库中用的是JDBC的批处理。代码如下
private void batchParseGroup(){
        Connection con
= null;
        PreparedStatement ps 
=null;
        
try {
            con
= DbConnectionManager.getConnection();
            con.setAutoCommit(
false);
            String sql 
= " insert into jivegroup(uri,groupname,pgroupid,description,creationdate,modificationdate,priority,selfpriority) values(?,?,?,?,?,?,?,?)";
            ps
= con.prepareStatement(sql);
            
for(int i=0;i<groupList.size();i++){
                Group group 
= groupList.get(i);
                ps.setString(
1, group.getUri());
                ps.setString(
2, group.getName());
                ps.setString(
3, group.getPgroupId());
                ps.setString(
4, group.getName());
                ps.setString(
5""+System.currentTimeMillis());
                ps.setString(
6""+System.currentTimeMillis());
                ps.setInt(
7, group.getPriority());
                ps.setInt(
8, group.getPriority());
                ps.addBatch();
                
if(i%100==0){
                    ps.executeBatch();
                }

            }

            con.commit();
            ps.executeBatch();
        }
 catch (SQLException e) {
            e.printStackTrace();
        }
finally{
            DbConnectionManager.closeConnection(ps, con);
        }

    }

在测试时,发现三十万的数据居然需要十分钟左右的时间。首先想到的就是Mysql的相关配置是不是有问题,反复修改了Mysql的相应配置参数,收效甚微。

在Mysql的官网上查到如下:
 http://dev.mysql.com/doc/refman/5.1/en/connector-j-reference-configuration-properties.html

关于rewriteBatchedStatements参数,Mysql官方的说明:

Should the driver use multiqueries (irregardless of the setting of "allowMultiQueries") as well as rewriting of prepared statements for INSERT into multi-value inserts when executeBatch() is called? Notice that this has the potential for SQL injection if using plain java.sql.Statements and your code doesn't sanitize input correctly. Notice that for prepared statements, server-side prepared statements can not currently take advantage of this rewrite option, and that if you don't specify stream lengths when using PreparedStatement.set*Stream(), the driver won't be able to determine the optimum number of parameters per batch and you might receive an error from the driver that the resultant packet is too large. Statement.getGeneratedKeys() for these rewritten statements only works when the entire batch includes INSERT statements.



解决办法:
      下载最新的JDBC的驱动程序。
      MYSQL URL的配置参数如下:
      jdbc:mysql://54.200.190.80:3306/ccb_ucstar?rewriteBatchedStatements=true

经过测试。三十多万的数据。70秒内搞定!

posted @ 2013-03-13 20:38 MikyTan 阅读(2788) | 评论 (0)编辑 收藏

Linux 使用 enca 工具进行文件批量格式转换

今天在做项目中,供应源提供了一小段的源代码,但文件编码格式是GBK的,而我公司建工程时统一用的UTF-8编码,导进来后出现乱码。为了解决这一问题,在网上查找了相关的资料,发现可以用 enca工具来进行批量转换

1)下载enca工具
  wget http://dl.cihar.com/enca/enca-1.13.tar.gz
2) tar -zxvf enca-1.13.tar.gz
3)./configure
4) make
5) make install


转换命令
  enca -L zh_CN -x UTF-8 *.java


posted @ 2012-09-17 11:42 MikyTan 阅读(1389) | 评论 (0)编辑 收藏