致命异常:AsyncTask#1 java.lang.RuntimeException:执行doInBackground()时发生错误,同时发送图像到服务器
问题描述:
伙计们我正在开发一个应用程序在Android上将图像从android应用程序传输到服务器。我已经在JAVA中实现了服务器,到目前为止,该应用程序仅用于内部网络目的。我在ASYNC类的代码中遇到了致命异常的问题,我没有得到我做错了什么。请帮助我,我会非常感谢你的人。致命异常:AsyncTask#1 java.lang.RuntimeException:执行doInBackground()时发生错误,同时发送图像到服务器
的Android应用程序代码
public class TakeImage extends ActionBarActivity {
Socket client;
DatagramSocket clientSocket;
byte[] image;
byte[] img;
private Bitmap bitmap;
private ImageButton camera;
private ImageButton gallery;
ImageView targetImage;
NotificationManager nm;
Uri fileUri = null;
private Button process;
private static int TAKE_PICTURE = 1;
private static int FROM_GALLERY = 2;
public static final int MEDIA_TYPE_IMAGE = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_take_image);
//Notification Code
nm=(NotificationManager)getSystemService(NOTIFICATION_SERVICE);
//
targetImage=(ImageView)findViewById(R.id.setImage);
process=(Button)findViewById(R.id.process);
process.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//bitmap=BitmapFactory.decodeResource(getResources(), R.id.setImage);
BitmapDrawable bd=(BitmapDrawable)targetImage.getDrawable();
bitmap=bd.getBitmap();
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 90, stream);
image = stream.toByteArray();
SendMessage sendMessageTask = new SendMessage();
sendMessageTask.execute();
Toast.makeText(getApplicationContext(),"Processing",Toast.LENGTH_LONG).show();
}
});
}
private class SendMessage extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
try {
int c=0;
InetAddress inet=InetAddress.getByName("192.168.1.4");
client = new Socket("192.168.1.4", 4000); // connect to the server
for(int i=0;i<image.length;i++) {
img[c] = image[i];
c++;
DatagramPacket packet;
packet = new DatagramPacket(img,img.length,inet,4000);
img = new byte[1024];
c = 0;
clientSocket.send(packet);
System.out.println("sent a mini-packet");
}
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
服务器端代码
public class Server {
private static ServerSocket serverSocket;
private static Socket clientSocket;
private static InputStreamReader inputStreamReader;
private static BufferedReader bufferedReader;
private static String message;
public static void main(String[] args) throws UnknownHostException {
try {
serverSocket = new ServerSocket(4000); // Server socket
} catch (IOException e) {
System.out.println("Could not listen on port: 4444");
}
System.out.println("Server started. Listening to the port 4444");
while (true) {
try {
clientSocket = serverSocket.accept(); // accept the client connection
inputStreamReader = new InputStreamReader(clientSocket.getInputStream());
bufferedReader = new BufferedReader(inputStreamReader); // get the client message
message = bufferedReader.readLine();
System.out.println(message);
inputStreamReader.close();
clientSocket.close();
} catch (IOException ex) {
System.out.println("Problem in message reading");
}
}
}
我只执行了服务器刚刚recieving字节不是将其转换为图像。
登录猫
04-04 07:13:27.630 920-981/com.example.ali.cottondiseasedetection E/AndroidRuntime﹕ FATAL EXCEPTION: AsyncTask #1
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:299)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
at java.util.concurrent.FutureTask.run(FutureTask.java:239)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
at java.lang.Thread.run(Thread.java:856)
Caused by: java.lang.NullPointerException
at com.example.ali.cottondiseasedetection.TakeImage$SendMessage.doInBackground(TakeImage.java:151)
at com.example.ali.cottondiseasedetection.TakeImage$SendMessage.doInBackground(TakeImage.java:135)
at android.os.AsyncTask$2.call(AsyncTask.java:287)
at java.util.concurrent.FutureTask.run(FutureTask.java:234)
答
需要初始化数组IMG你分配什么之前。
img = new byte[1024];
for(int i=0;i<image.length;i++) {
img[c] = image[i];
c++;
DatagramPacket packet;
packet = new DatagramPacket(img,img.length,inet,4000);
img = new byte[1024];
c = 0;
clientSocket.send(packet);
System.out.println("sent a mini-packet");
}
+0
我也试过这个,但没有为我工作。 – 2015-04-04 07:18:12
请在logcat中发布错误的确切输出。 – Chris 2015-04-03 17:41:15
@Chris现在我也根据您的要求放置了日志猫。 – 2015-04-04 07:17:29