-1

我正在尝试从我的安卓手机向我的本地网络服务器发送一张图片。一旦它连接到网络服务器,我得到以下信息: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;
  }

}
4

3 回答 3

2

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

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

于 2013-05-21T15:13:53.810 回答
0

您不能在主线程中执行任何网络操作。为了摆脱问题,在另一个线程中执行与网络相关的任务,或者AsyncTask

有关详细信息,请查看此链接

于 2013-05-21T15:09:38.277 回答
0

Android 系统不允许对 UI Thread 进行长操作,因此它可以自由处理所有接口操作,包括网络操作或长数据访问。

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

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

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

于 2013-05-21T15:19:17.197 回答