banxitan

          統計

          留言簿(2)

          閱讀排行榜

          評論排行榜

          2013年7月11日 #

          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)編輯 收藏

          主站蜘蛛池模板: 加查县| 东丰县| 西安市| 霍林郭勒市| 大渡口区| 哈尔滨市| 东乌珠穆沁旗| 金塔县| 沧源| 沅陵县| 英吉沙县| 绥芬河市| 杭州市| 宜春市| 孝感市| 石家庄市| 泰和县| 靖江市| 张家界市| 莒南县| 绥宁县| 大理市| 盱眙县| 鄄城县| 时尚| 江津市| 太谷县| 宜良县| 从化市| 金昌市| 茶陵县| 浪卡子县| 兴和县| 突泉县| 临漳县| 深泽县| 云浮市| 双流县| 邢台县| 伊通| 潮州市|