如何避免android.os.NetworkOnMainThreadException

时间:2013-05-21 15:08:39

标签: java android web-services asynchronous

我正试图从我的Android手机向我的本地网络服务器发送图片。连接到Web服务器后,我得到以下内容:android.os.NetworkOnMainThreadException

我认为我的问题的解决方案是使方法异步。这是我不熟悉的。

所以我的问题是: 如何使以下方法异步?

public class Send {
    public Send(){
    }

public static String send(String path) throws Exception {
    String filePath = path;
    String svar;

    HttpClient httpclient = new DefaultHttpClient();
    try {
        HttpPost httppost = new HttpPost("path to web server"); 
        FileBody pic = new FileBody(new File(filePath)); 
        MultipartEntity requestEntity = new MultipartEntity(); 
        requestEntity.addPart("file", pic);

        httppost.setEntity(requestEntity);
        System.out.println("executing request " + httppost.getRequestLine());
        HttpResponse response = httpclient.execute(httppost);
        HttpEntity responseEntity = response.getEntity();
        System.out.println("----------------------------------------");
        System.out.println(response.getStatusLine());

        ByteArrayOutputStream outstream = new ByteArrayOutputStream();
        response.getEntity().writeTo(outstream);
        byte [] responseBody = outstream.toByteArray();
        svar = new String(responseBody);
        System.out.println(svar);

    } finally {
        try {
            httpclient.getConnectionManager().shutdown();
        } 
        catch (Exception ignore) {
      }
    }
    return svar;
  }

}

3 个答案:

答案 0 :(得分:2)

无法在主线程上执行阻止操作,因为这会给用户带来糟糕的体验。

AsyncTask并不难解决。 doInBackground方法在另一个线程上运行。 onPostExecute方法允许您更新UI,因为此方法在主线程上运行。任何其他线程都不允许更新UI。

答案 1 :(得分:0)

您无法在主线程中执行任何网络操作。要解决问题,请在另一个线程中执行与网络相关的任务,或AsyncTask

有关详细信息,请查看此link

答案 2 :(得分:0)

Android系统不允许在UI线程上进行长时间操作,因此可以自由处理所有接口操作,包括网络操作或长时间数据访问。

正如其他人所说,执行这些网络操作的正确方法是使用AsyncTask。

当我遇到同样的问题时,本教程对我很有帮助=)

http://www.chupamobile.com/tutorial/details/116/Android+Threads,+Handlers+and+AsyncTask/