2016-04-30 59 views
0

我正在构建一个应用程序,它将持续获取我的笔记本电脑屏幕截图并将其传输到我的android应用程序,但while循环内有一些问题,当我将for循环放入限制时,我的程序运行,但它会一直持续到无穷大,或者我将它替换为无限循环,我的代码会暂停所有线程和应用程序崩溃,从而导致内存分配问题,请建议我无限次执行代码,以便显示连续的屏幕截图。所有主题被暂停

谢谢。

这里是我的代码

public class ScreenActivity extends AppCompatActivity { 

ImageView img; 
int width,height; 
@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(); 
    //  while (true) 
    for (int i=0;i<100;i++) 
     new GetImg().execute(); 

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

    @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 void onPostExecute(Bitmap bm) 
    { 
     img.setImageBitmap(bm); 
    } 
} 
} 
+1

你不能在主线程上一个无限循环。将你的循环移出'onCreate'。另外请注意,您正在同时设置所有图像,因为您正在启动在后台运行的100个(或无限)AsyncTasks。这是你想要做的吗?我会假设你想要一个接一个地拍摄图像,因为你覆盖了相同的ImageView。 – m0skit0

回答

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(); 
}