我在android中有一个客户端使用TCP套接字连接到c ++中的服务器。 我需要我的应用程序不断发送图像到服务器。我尝试使用无限(while)循环,但是我的应用程序在运行循环时没有做任何其他事情,我需要我的应用程序不断发送图像,但也能够同时运行任务。 这是我的代码:
class sendImage implements Runnable{
@Override
public void run() {
while(true){
try {
Bitmap bmp=screenShot();
ByteArrayOutputStream bosBitmap = new ByteArrayOutputStream();
bmp.compress(CompressFormat.JPEG, 50, bosBitmap);
byte[] arrayBitmap = bosBitmap.toByteArray();
OutputStream os = socket.getOutputStream();
BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
DataOutputStream dos = new DataOutputStream(bos);
dos = new DataOutputStream(os);
dos.write(arrayBitmap, 0, arrayBitmap.length);
dos.flush();
memecontentView.destroyDrawingCache();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
当我点击一个按钮时,这就是我初始化线程的方式
public void onClick(View view) {
new Thread(new sendImage()).start();
}
但是当我点击按钮时,图像会被发送,但它不允许我做任何其他事情,如果我按下另一个按钮,我的应用程序关闭 如何运行允许我的应用同时执行其他任务的无限循环?
答案 0 :(得分:2)
如果需要保持线程长时间运行,强烈建议您使用java.util.concurrent pacakge提供的各种API,例如Executor,ThreadPoolExecutor和FutureTask。
答案 1 :(得分:0)
如果有人发现它有用,我会发布我的解决方案 我刚刚实现了AsyncTask,它运行得很好:
public class SendImage extends AsyncTask<Void,Void,Void>{
@Override
protected Void doInBackground(Void... arg0){
while(true){
try {
Bitmap bmp=screenShot();
ByteArrayOutputStream bosBitmap = new ByteArrayOutputStream();
bmp.compress(CompressFormat.JPEG, 30, bosBitmap);
byte[] arrayBitmap = bosBitmap.toByteArray();
OutputStream os = socket.getOutputStream();
BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream());
DataOutputStream dos = new DataOutputStream(bos);
dos = new DataOutputStream(os);
dos.write(arrayBitmap, 0, arrayBitmap.length);
dos.flush();
memecontentView.destroyDrawingCache();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}