无法由“ NetworkOnMainThreadException”引起的意图启动服务

问题描述 投票:0回答:1

我正在处理要在设备上发送的图像,当我使用异步任务时可以正常工作,但可以正常工作,但问题是,当我通过Service进行操作时,它不起作用,并且出现此错误,“无法启动由“ NetworkOnMainThreadException”引起的意图服务。我实际上是将byte []从MainActivity传递给Service我需要使用服务,因为BroadcastReceiver的OnReceive方法无法响应异步任务。

谢谢!

在Mainfest.xml中

 <service android:name=".SendImageClientService"/>

MainActivity

       ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, byteArrayOutputStream);
       byte[] array = byteArrayOutputStream.toByteArray();


        Intent serviceIntent=new Intent(this,SendImageClientService.class);
        serviceIntent.putExtra("byte",array);
        this.startService(serviceIntent);

服务等级


public class SendImageClientService extends Service {

    Handler handler = new Handler(Looper.getMainLooper());

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        try {

            byte[] bytesss=intent.getByteArrayExtra("byte");

            Socket socket = new Socket("ip_address_here", 8888);

            OutputStream out = socket.getOutputStream();
            DataOutputStream dataOutputStream = new DataOutputStream(out);
            dataOutputStream.write(bytesss);
            handler.post(new Runnable() {
                @Override
                public void run() {
                    Toast.makeText(SendImageClientService.this, "Image sent", Toast.LENGTH_SHORT).show();
                }
            });

            dataOutputStream.close();
            out.close();
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return START_STICKY;

    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }
}

android sockets exception android-intent service
1个回答
0
投票

文档说:

注意:服务在其托管过程的主线程中运行;的服务不会创建自己的线程,也不会在单独的线程中运行除非您另外指定,否则处理。如果您的服务要执行任何占用大量CPU的工作或阻止操作,例如MP3播放或联网时,您应该在服务来完成这项工作。通过使用单独的线程,您可以降低应用程序无响应(ANR)错误的风险,并且应用程序的主线程可以保持专用于用户交互与您的活动。

https://developer.android.com/guide/components/services

因此,您需要在服务中创建新线程以进行长时间操作。

另外,您需要知道,服务用于长时间的后台任务,而IntentServices用于短期的后台任务。但是IntentService在单独的线程中工作。

© www.soinside.com 2019 - 2024. All rights reserved.