2016-04-30 2 views
0

Je construis une application qui va continuellement obtenir des captures d'écran de mon écran d'ordinateur portable et le transférer vers mon application android mais il y a un problème dans la boucle while, quand je mets une boucle pour mon programme fonctionne mais comme il va jusqu'à l'infini ou je le remplace par infini tout en boucle mon code suspend tous les threads et l'application crash duo problème d'allocation de mémoire, s'il vous plaît me suggérer d'exécuter mon code infini fois pour qu'il y ait des captures d'écran continues.Tous les threads sont suspendus

Merci.

Voici mon code

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

Vous ne pouvez pas faire une boucle infinie sur un fil principal. Déplacez votre boucle hors de 'onCreate'. Notez également que vous définissez toutes les images en même temps car vous lancez 100 (ou infinies) AsyncTasks, qui s'exécutent en arrière-plan. Est-ce que c'est ce que tu veux faire? Je suppose que vous voulez prendre les images les unes après les autres puisque vous écrasez le même ImageView. – m0skit0

Répondre

0

@ m0skit0 a commenté la raison réelle d'obtenir l'ANR. Vous êtes hors de votre mémoire d'exécution lorsque vous créez des threads dans une boucle infinie. Cependant, je suis assez confus au sujet de votre objectif. Je pense que vous devez obtenir les captures d'écran une après l'autre et si c'est le cas, vous pouvez simplement ajouter un écouteur au AsyncTask et recevoir le rappel lorsque la capture d'écran est entièrement téléchargée. Donc si j'ai bien compris, vous devez déclarer un interface comme ceci.

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

Maintenant, vous devez implémenter l'interface dans votre Activity comme celui-ci

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 
    } 
    } 
} 

Vous devez modifier votre AsyncTask un peu. Vous devez déclarer le 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"); 
    } 
} 

donc votre fonction onCreate ressemblera à ceci maintenant

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