2016-04-30 3 views
0

私は自分のラップトップ画面のスクリーンショットを連続的に取得し、それを私のアンドロイドアプリに転送するアプリケーションを構築していますが、whileループ内にいくつかの問題があります。それが無限になるまで、または無限ループに置き換えて、私のコードがすべてのスレッドを停止させ、アプリケーションのクラッシュのためにメモリ割り当ての問題が発生した場合は、コードを無限に実行して、スクリーンショットが表示されるようにしてください。すべてのスレッドが中断されます

ありがとうございます。ここで

は私のコードm0skit0 @

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

がANRを得るための実際の理由をコメントしています。無限ループでスレッドを作成するときは、実行時のメモリを使い果たします。私はあなたの目的についてかなり混乱しています。スクリーンショットを1つずつ取得する必要があると思います。その場合は、AsyncTaskにリスナーを追加して、スクリーンショットが完全にダウンロードされたときにコールバックを取得するだけです。

私が正しく理解している場合は、このようにinterfaceを宣言する必要があります。

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

今、あなたはあなたがあなたのAsyncTaskビットを変更する必要があなたの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 
    } 
    } 
} 

でインターフェイスを実装する必要があります。 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(); 
} 
関連する問題