banxitan

          統(tǒng)計(jì)

          留言簿(2)

          閱讀排行榜

          評(píng)論排行榜

          2013年5月8日 #

          Android Activity MainThread 中不能執(zhí)行http通信解決辦法

          今天在做離線文件傳輸時(shí)。用HTTP上傳文件。程序一運(yùn)行 報(bào)如下的錯(cuò)誤
          android.os.NetworkOnMainThreadException

          原因是Google從3開(kāi)始,強(qiáng)制默認(rèn)禁止UI主線程發(fā)起通信請(qǐng)求 

          解決辦法: 

          把通信的代碼轉(zhuǎn)移到子線程里去做, 比較靠譜的是new一個(gè)AyncTask,在里面做通信

                                    有幾個(gè)細(xì)節(jié)性的問(wèn)題是,

                                          第一, 一般原有通信的代碼都是共通的API, 被許多個(gè)Activity調(diào)用, 一個(gè)良好的修改方法是在共通API里面new AyncTask

                                         第二, 通信的API一般來(lái)說(shuō)都是同步的, 你通信,然后畫(huà)面主線程需要堵塞住,等待API的通信結(jié)果,再?zèng)Q定下面的業(yè)務(wù)邏輯的走向。

          所以,這塊可以采取 AyncTask.get(), 讓主線程堵塞,直到通信結(jié)束。 當(dāng)然,如果你需要將通信異步的話, 可以用Handler機(jī)制來(lái)解決


          具體調(diào)用代碼如下:HTTP異

          步請(qǐng)求

          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;
          }


          }



          調(diào)用代碼如下:


          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 閱讀(1087) | 評(píng)論 (0)編輯 收藏

          修改模擬器DNS方法

          今天在做手機(jī)終端開(kāi)發(fā)時(shí),發(fā)現(xiàn)連上域名服務(wù)器老是連不上,而直接用IP連接是OK的,初步懷凝是DNS問(wèn)題引起來(lái),經(jīng)查相關(guān)的資料,現(xiàn)記錄如下:

          Android模擬器默認(rèn)的地址是10.0.2.3,默認(rèn)的DNS也是10.0.2.3,而一般電腦的IP都是192.168.1.100之類的,不在同一個(gè)網(wǎng)段。所以就會(huì)出現(xiàn)電腦可以上網(wǎng)但是模擬器不能上網(wǎng)的情況。其實(shí)設(shè)置方法很簡(jiǎn)單,只要把模擬器的默認(rèn)DNS設(shè)置成電腦的DNS地址即可。
          第一步:用系統(tǒng)的命令進(jìn)入Android開(kāi)發(fā)包的tools目錄
           cd X:\...\android-sdk-windows\tool
          第二布:使用adb的shell,確認(rèn)系統(tǒng)的各項(xiàng)屬性
          adb shell
          getprop 
          getprop會(huì)列出系統(tǒng)當(dāng)前的各項(xiàng)屬性
          第三步:得到模擬器的DNS地址
          在結(jié)果里可以看到:
          [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 閱讀(1274) | 評(píng)論 (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 閱讀(257) | 評(píng)論 (0)編輯 收藏

          Oralce 監(jiān)聽(tīng)器啟動(dòng)


          啟動(dòng)      lsnrctl start
          狀態(tài)      lsnrctl status
          關(guān)閉      lsnrctl  stop

          posted @ 2013-05-11 14:47 MikyTan 閱讀(182) | 評(píng)論 (0)編輯 收藏

          Oracle 導(dǎo)出、導(dǎo)入某用戶所有數(shù)據(jù)(包括表、視圖、存儲(chǔ)過(guò)程...)


          導(dǎo)出命令:exp 用戶名/密碼@數(shù)據(jù)庫(kù) owner=用戶名 file=文件存儲(chǔ)路徑(如:F:\abcd.dmp)

          測(cè)試截圖:exp ZM/sql123@ORCL owner=ZM file=F\abcd.dmp



          導(dǎo)入命令:imp 用戶名/密碼@數(shù)據(jù)庫(kù) fromuser=用戶名 touser=用戶名 file=d:\cu.dmp ignore=y

           imp:命令類型  

          cu/mycu@db:導(dǎo)入的數(shù)據(jù)庫(kù)登陸(用戶名/密碼@數(shù)據(jù)庫(kù))  

          fromuser:文件的指定用戶

           touser:指定導(dǎo)入到當(dāng)前登錄的數(shù)據(jù)庫(kù)某個(gè)用戶  

          file:需要導(dǎo)入的數(shù)據(jù)文件  

          ignore:是否忽略創(chuàng)建錯(cuò)誤

           

          測(cè)試截圖:

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





          posted @ 2013-05-11 09:59 MikyTan 閱讀(393) | 評(píng)論 (0)編輯 收藏

          linux環(huán)境下的rmi常見(jiàn)問(wèn)題

          linux環(huán)境下的rmi常見(jiàn)問(wèn)題

          問(wèn)題一:RMI服務(wù)提供程序運(yùn)行在Windows操作系統(tǒng)下,RMI服務(wù)可以正常訪問(wèn),但將RMI服務(wù)提供程序部署到Linux操作系統(tǒng)下后,RMI服務(wù)無(wú)法訪問(wèn),提示

          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服務(wù)之前將當(dāng)前服務(wù)器的IP指定給hostName,如 System.setProperty("java.rmi.server.hostname", "192.168.100.7");或者修改/etc/hosts文件,在這個(gè)文件中加 192.168.100.54  testlinux1 localhost.localdomain localhost 就行,或者將/etc/hosts文件中默認(rèn)的127.0.0.1改成當(dāng)前機(jī)器的IP即可!

          問(wèn)題二:java.rmi.server.ExportException: internal error: ObjID already in use Caused by: java.rmi.server.ExportException: internal error: ObjID already in use……

          出現(xiàn)這種問(wèn)題及有可能是/etc/hosts文件中指定的IP并不是當(dāng)前服務(wù)器的真實(shí)IP,RMI在初始化時(shí)注冊(cè)服務(wù)失敗。

          通過(guò)System.out.println(InetAddress.getLocalHost().toString());查看當(dāng)前主機(jī)的IP是否為真實(shí)IP,如顯示為SIMBANK/220.250.64.24,而真實(shí)IP為192.168.1.2         

          解決辦法:修改/etc/hosts文件中錯(cuò)誤的IP即可,將:

          220.250.64.24          SIMBANK
          修改為

          192.168.1.2          SIMBANK

          posted @ 2013-05-08 20:26 MikyTan 閱讀(3785) | 評(píng)論 (0)編輯 收藏

          主站蜘蛛池模板: 囊谦县| 枣阳市| 乐平市| 泰和县| 永济市| 新密市| 平凉市| 昌江| 阜南县| 余江县| 高唐县| 安仁县| 琼海市| 西平县| 卫辉市| 蛟河市| 呼伦贝尔市| 内乡县| 赣榆县| 星座| 澄江县| 孟州市| 永清县| 聂荣县| 友谊县| 临洮县| 安福县| 新疆| 石棉县| 龙井市| 怀安县| 洛阳市| 屏东市| 盐城市| 黎平县| 商洛市| 长阳| 湟源县| 昌江| 文安县| 英超|