banxitan

          統計

          留言簿(2)

          閱讀排行榜

          評論排行榜

          2013年6月4日 #

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

          主站蜘蛛池模板: 武清区| 固阳县| 永丰县| 桐梓县| 常宁市| 北流市| 昔阳县| 柳江县| 高尔夫| 利辛县| 余姚市| 泸州市| 昌吉市| 壶关县| 内乡县| 邵阳县| 绥滨县| 繁昌县| 缙云县| 黑河市| 饶河县| 德钦县| 隆安县| 安福县| 旅游| 自治县| 绍兴县| 榆社县| 新乡县| 白山市| 达孜县| 郓城县| 博湖县| 宁晋县| 镇平县| 丹凤县| 米泉市| 青龙| 台南市| 信阳市| 老河口市|