我的服务在后台上传了一些文件,并在我的清单中将其声明为
<service
android:name="uploader.services.AttachService"
android:icon="@drawable/loading_icon"
android:label="@string/attachServiceName"
android:process=":attachServiceBackground" />
在Android 4.1.1上它出现NetworkOnMainThreadException
,但我不知道为什么。我知道,因为蜂窝不允许在主线程上进行网络连接,这就是为什么服务将在自己的线程中运行。
其实我正在开始这项服务我的活动
startService(new Intent(MainActivity.this, AttachService.class));
是否有必要在AsyncTask中启动服务,尽管它声明在自己的线程中运行? 这是我的服务方法不起作用
public static String attach(File attRequestFile, File metaDataFile, Job j) {
String retVal = "";
HttpClient client = new DefaultHttpClient();
HttpPost post = new HttpPost(j.getTarget().getServiceEndpoint() + ATTACH_PATH);
MultipartEntity mp = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
mp.addPart("metadata", new FileBody(metaDataFile));
mp.addPart("request", new FileBody(attRequestFile));
File img = new File(j.getAtach().getAttUri());
if (img != null){
mp.addPart("data", new FileBody(img));
}
post.setEntity(mp);
HttpResponse response;
try {
response = client.execute(post);
if (response.getEntity() == null){
retVal = "";
}
else{
BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
StringBuffer sb = new StringBuffer();
String line = "";
while ((line = rd.readLine()) != null) {
sb.append(line);
}
retVal = sb.toString();
}
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return retVal;
}
使用设置视图中的按钮,用户可以启动服务,如此
public void startSendDataAction(View view){ startService(new Intent(this,AttachService.class)); }
任何建议原因是什么?
由于
答案 0 :(得分:1)
您可以使用以下代码禁用严格的线程执行模式:
if (android.os.Build.VERSION.SDK_INT > 9) {
StrictMode.ThreadPolicy policy =
new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
}
同样不建议这样做。使用需要使用AsyncTask接口以获得更好的结果。
答案 1 :(得分:0)