Any class is under View NEEDS to be in the Main Thread.

On Tuesday, May 1, 2012 2:09:15 PM UTC-4, Ab wrote:
>
> This TestActivity mimics some behavior in my app, which casues an ANR on 
> the Samsung Note ( running Android version 2.3.6).  It did not produce an 
> ANR on a few other devices I tried, including 2 different Samsung devices 
> both with 2.3.6.
>
> Based on the traces.txt file, the GUI thread appears to get stuck while 
> painting an ImageButton.  No idea why this happens, but the traces.txt is 
> pastebin-ed below.
>
> The Activity creates a layout with a lot of ImageButtons, each of which 
> will cause the entire layout to invalidate when pressed.  It then starts a 
> new thread which renders a Bitmap into a canvas.  The Bitmap is painted 
> into the canvas one line at a time, by using Canvas.drawBitmap(int[]....); 
> the ANR occurs regardless of the pixel values of the Bitmap, so the test 
> app just uses an instantiated int[] (in which all values are 0).  If I 
> randomly press the buttons on the screen, the application will ANR after 
> 10-30seconds.
>
> I don't think the ANR is dependent on the width and height values of the 
> Bitmap being rendered, or the dimensions of the Bitmap that is used as the 
> parameter in the Canvas' constructor.  However, it is dependent on the 
> canvas.scale(.36f, .36f) that occurs prior to the bitmap rendering.  I'm 
> not sure if values other than ".36" cause the ANR, but the ANR does not 
> occur if no scaling happens prior to the drawBitmap call.  Also, the ANR 
> does not occur unless the Canvas object is created with a Bitmap as its 
> parameter.
>
> So, my guess is that this is somehow related to the Samsung Note's native 
> implementation of Canvas.drawBitmap.  Any ideas what would cause the GUI 
> thread to be blocked and how it can be prevented?
>
> http://pastebin.com/hummn87H
>
>     public class TempActivity extends Activity implements 
> android.view.View.OnClickListener
>     {
>     LinearLayout contentView;
>         public void onCreate(Bundle savedInstanceState) 
>         {
>             super.onCreate(savedInstanceState);
>             
>             Log.e("", ""+1);
>             
>             contentView = new LinearLayout(this);
>             contentView.setOrientation(LinearLayout.VERTICAL);
>             
>             //add a few rows of image buttons
>             contentView.addView(initRow());
>             contentView.addView(initRow());
>             contentView.addView(initRow());
>             contentView.addView(initRow());
>             contentView.addView(initRow());
>             contentView.addView(initRow());
>             
>             setContentView(contentView);
>             
>             RenderThread task1 = new RenderThread();
>             task1.start();
>         }
>         
>         public class RenderThread extends Thread 
>         {
>             public void run() 
>             {
>             Paint paint = new Paint();
>             Bitmap bitmap = Bitmap.createBitmap(500, 500, 
> Config.ARGB_8888);
>             
>             int width = 800;
>             int height = 1000;
>             
>             int[] pixels = new int[width];
>             
>             while (1!= 0)
>     {
>     Canvas canvas = new Canvas(bitmap);
>     canvas.scale(.36f, .36f);
>     for(int i = 0; i < height; i++)
>         {
>     canvas.drawBitmap(pixels, 0, width, 0, i, width, 1, false, paint);
>         }
>     }
>             }
>         }
>         
>         private View initRow()
>         {
>          LinearLayout row = new LinearLayout(this);
>              row.setOrientation(LinearLayout.HORIZONTAL);
>              ImageButton button = new ImageButton(this);
>              button.setImageResource(R.drawable.icon);
>              button.setOnClickListener(this);
>              row.addView(button);
>              button = new ImageButton(this);
>              button.setImageResource(R.drawable.icon);
>              button.setOnClickListener(this);
>              row.addView(button);
>              button = new ImageButton(this);
>              button.setImageResource(R.drawable.icon);
>              button.setOnClickListener(this);
>              row.addView(button);
>              button = new ImageButton(this);
>              button.setImageResource(R.drawable.icon);
>              button.setOnClickListener(this);
>              row.addView(button);
>              button = new ImageButton(this);
>              button.setImageResource(R.drawable.icon);
>              button.setOnClickListener(this);
>              row.addView(button);
>              button = new ImageButton(this);
>              button.setImageResource(R.drawable.icon);
>              button.setOnClickListener(this);
>              row.addView(button);
>              
>              return row;
>         }
>     
>     @Override
>     public void onClick(View v) 
>     {
>     contentView.postInvalidate();
>     }    
>     }
>
>

-- 
You received this message because you are subscribed to the Google
Groups "Android Developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/android-developers?hl=en

Reply via email to