所有线程都被暂停

时间:2016-04-30 20:51:41

标签: android sockets

我正在构建一个应用程序,它将不断获取我的笔记本电脑屏幕的截图并将其传输到我的Android应用程序但是在while循环中存在一些问题,当我将for循环置于限制然后我的程序运行但是因为它直到无限或我用无限循环替换它我的代码暂停所有线程和应用程序崩溃dueto内存分配问题,请建议我无限次执行我的代码,以便显示连续的屏幕截图。

谢谢。

这是我的代码

LayoutManagers

1 个答案:

答案 0 :(得分:0)

@ m0skit0评论了获得ANR的实际原因。当您在无限循环中创建线程时,您将从运行时内存中退出。我对你的目的感到很困惑。我认为您需要一个接一个地获取屏幕截图,如果是这种情况,您只需向AsyncTask添加一个监听器,并在完全下载屏幕截图时获取回调。

因此,如果我已正确理解,您需要声明interface这样的内容。

public interface DownloadCompletedListener {
    public void onDownloadComplete(String result);
}

现在您需要在Activity中实现这样的界面

public class ScreenActivity extends AppCompatActivity implements DownloadCompletedListener {

  private GetImg getImageTask;
  private Bitmap imageBitmap;

  @Override
  public void onDownloadComplete(String result) {
    if(result.equals("SUCCESS")) {
      // Set the image now
      img.setImageBitmap(imageBitmap);

      // Start next download here
      getImageTask = new GetImg();
      getImageTask.mListener = this;
      getImageTask.execute();

    } else {
      // Do something
    }
  }
}

您需要稍微修改AsyncTask。您需要声明DownloadCompletedListener

public class GetImg extends AsyncTask<Object,Void,Bitmap> {

    private DownloadCompletedListener mListener;

    @Override
    protected Bitmap doInBackground(Object[] params) {
        Socket client= null;
        try {
            client = new Socket("192.168.1.5",6767);
        InputStream in=client.getInputStream();
        imgscr=Bitmap.createScaledBitmap(BitmapFactory.decodeStream(in), width, height, false);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return imgscr;
    }

    @Override
    protected String onPostExecute(Bitmap bm)
    {
        imageBitmap = bm;
        mListener.onDownloadComplete("SUCCESS");
    }
}

所以你的onCreate函数现在看起来像这样

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_screen);
    img=(ImageView)findViewById(R.id.imageView);
    Display display = getWindowManager().getDefaultDisplay();
    width = display.getWidth();
    height = display.getHeight();

    // Start downloading image here. Remove the loop
    getImageTask = new GetImg();
    getImageTask.mListener = this;
    getImageTask.execute();
}