Java Can';t将字节数组转换为通过套接字发送的imageView
我无法将字节数组转换为图像,但无法在图像视图中进行转换 在我按下“发送”按钮后,应用程序关闭并出错,您将在下面看到它。 所以我需要帮助 我尝试将图像从java服务器发送到android客户端。Java Can';t将字节数组转换为通过套接字发送的imageView,java,android,sockets,android-imageview,android-bitmap,Java,Android,Sockets,Android Imageview,Android Bitmap,我无法将字节数组转换为图像,但无法在图像视图中进行转换 在我按下“发送”按钮后,应用程序关闭并出错,您将在下面看到它。 所以我需要帮助 我尝试将图像从java服务器发送到android客户端。 我已经检查了接收到的字节数组是否充满字节,但我确实无法转换它 这是我的密码: Android客户端 package com.example.metalheadi.convert2; import android.graphics.Bitmap; import android.graphics.Bitmap
我已经检查了接收到的字节数组是否充满字节,但我确实无法转换它 这是我的密码: Android客户端
package com.example.metalheadi.convert2;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.net.Socket;
public class MainActivity extends AppCompatActivity {
EditText IP, Port, Msg;
Button Send;
ImageView image;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Send = (Button) findViewById(R.id.send);
IP = (EditText) findViewById(R.id.ip_e);
Port = (EditText) findViewById(R.id.port_e);
image = (ImageView) findViewById(R.id.imageView1);
// Msg = (EditText) findViewById(R.id.msg_e);
Send.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
Socket socket = new Socket(IP.getText().toString(), Integer.parseInt(Port.getText().toString()));
DataInputStream in= new DataInputStream(socket.getInputStream()) ;
ByteArrayOutputStream out = new ByteArrayOutputStream();
byte buffer[] = new byte[1024];
try {
int count;
while ((count = in.read(buffer)) > 0)
{
out.write(buffer, 0, count);
}
} catch (IOException e1) {
e1.printStackTrace();
}
byte[]result= out.toByteArray();
for (int g=0;g<result.length;g++){
System.out.println(g);
}
System.out.println("here ");
Bitmap bmp = BitmapFactory.decodeByteArray(result, 0, result.length);
Drawable drawable = new BitmapDrawable(getResources(), bmp);
image.setImageDrawable(drawable);
// image.setImageBitmap(Bitmap.createScaledBitmap(bmp, image.getWidth(), image.getHeight(), false));
// DataInputStream dIn=new DataInputStream(socket.getInputStream());
// int length = dIn.readInt(); // read length of incoming message
// if(length>0) {
// byte[] message = new byte[length];
// dIn.readFully(message, 0, message.length); // read the message
// }
//// Toast.makeText(MainActivity.this,"heeeeere",Toast.LENGTH_LONG).show();
// System.out.println("here ");
/////////////////////////////////////////////////////////
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
});
thread.start();
}
});
}
}
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.metalheadi.convert2.MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="IP"
android:id="@+id/ip"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="PORT"
android:id="@+id/port"
android:layout_below="@+id/ip_e"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/ip_e"
android:layout_alignParentTop="true"
android:layout_toRightOf="@+id/ip"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true" />
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/port_e"
android:layout_below="@+id/port"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignRight="@+id/ip_e"
android:layout_alignEnd="@+id/ip_e" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="SEND"
android:id="@+id/send"
android:layout_below="@+id/port_e"
android:layout_alignRight="@+id/port_e"
android:layout_alignEnd="@+id/port_e" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/imageView1"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignParentBottom="true"
android:layout_below="@+id/send"
android:layout_alignRight="@+id/send"
android:layout_alignEnd="@+id/send"
android:nestedScrollingEnabled="false" />
</RelativeLayout>
Android logcat错误
1-19 01:43:43.964 24869-25529/com.example.metalheadi.convert2 E/AndroidRuntime: FATAL EXCEPTION: Thread-11797
android.view.ViewRootImpl$CalledFromErrorThreadException:只有创建视图层次结构的原始线程才能接触其视图。
在android.view.ViewRootImpl.checkThread(ViewRootImpl.java:5498)
在android.view.ViewRootImpl.requestLayout(ViewRootImpl.java:1062)
在android.view.view.requestLayout上(view.java:16375)
在android.view.view.requestLayout上(view.java:16375)
在android.view.view.requestLayout上(view.java:16375)
在android.view.view.requestLayout上(view.java:16375)
在android.view.view.requestLayout上(view.java:16375)
在android.view.view.requestLayout上(view.java:16375)
在android.widget.RelativeLayout.requestLayout(RelativeLayout.java:318)上
在android.view.view.requestLayout上(view.java:16375)
位于com.example.metalheadi.convert2.MainActivity$1$1.run(MainActivity.java:66)的android.widget.ImageView.setImageDrawable(ImageView.java:418)
在java.lang.Thread.run(Thread.java:856)上,异常显示
setImageDrawable
未在UI线程上运行。在Android中,所有UI操作都必须在主线程上执行。您可以将呼叫包装为以下内容:
runOnUiThread(new Runnable() {
public void run() {
// Update UI elements
}});
由于您正在跨越一个新线程以从套接字读取,
image.setImageDrawable(drawable)应该从ui线程调用代码>
您可以将其替换为:
runOnUiThread(new Runnable() {
@Override
public void run() {
image.setImageDrawable(drawable);
}
});
但是,使用AsyncTask
将是一个更好的解决方案,而不是跨越您自己的线程,因为它有更方便的回调方法来在ui和后台线程之间切换 您正在将图像大小写在图像之前,但您没有阅读它:相反,您将长度字视为图像的一部分。您是否正在使用bytearray输出流??对不起,我可以要求更具体一点吗?或者我应该搜索什么??我很抱歉。我是beginner@MohamedHani我说的是dOut.writeInt(bytes.length)服务器中的code>,应该有相应的int length=dIn.readInt()客户端中的code>,或者删除writeInt()
调用,因为您不需要它,因为您在发送映像后仍将关闭连接。您在已注释掉的代码中拥有它。
runOnUiThread(new Runnable() {
@Override
public void run() {
image.setImageDrawable(drawable);
}
});