我正试图从我的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;
}
}
答案 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/