虽然我的网络服务是在自己的线程中声明的,但是会发生NetworkOnMainThreadException?

时间:2013-01-17 09:32:16

标签: android android-networking

我的服务在后台上传了一些文件,并在我的清单中将其声明为

<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));     }

任何建议原因是什么?

由于

2 个答案:

答案 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)

documentation

是sais
  与其他应用程序对象一样,

服务在其托管进程的主线程中运行

所以我想如果你想在你的服务中做一些网络工作,你最好在后台线程中进行(无论它运行的是什么进程)。