我正在处理要在设备上发送的图像,当我使用异步任务时可以正常工作,但可以正常工作,但问题是,当我通过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();
}
}
文档说:
注意:服务在其托管过程的主线程中运行;的服务不会创建自己的线程,也不会在单独的线程中运行除非您另外指定,否则处理。如果您的服务要执行任何占用大量CPU的工作或阻止操作,例如MP3播放或联网时,您应该在服务来完成这项工作。通过使用单独的线程,您可以降低应用程序无响应(ANR)错误的风险,并且应用程序的主线程可以保持专用于用户交互与您的活动。
https://developer.android.com/guide/components/services
因此,您需要在服务中创建新线程以进行长时间操作。
另外,您需要知道,服务用于长时间的后台任务,而IntentServices用于短期的后台任务。但是IntentService在单独的线程中工作。