0

here is the problem, before this i put all the code under onCreate(); but it took like more than 10sec to load, it displays blank screen until the screen is fully loaded. so i moved some of the code to doInBackground. but i face some problem which never occur under onCreate(), lets see the code now:

String photoURL1;
@Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.app_details);

    tvDescription = (TextView)findViewById(R.id.tvDescription);

    tvTitle = (TextView)findViewById(R.id.tvTitle);
    tvDeveloper = (TextView)findViewById(R.id.tvDeveloper);

    rbRating = (RatingBar)findViewById(R.id.rbRating);

    ivLogo = (ImageView)findViewById(R.id.ivLogo);
    ivPhoto1 = (ImageView)findViewById(R.id.ivPhoto1);
    ivPhoto2 = (ImageView)findViewById(R.id.ivPhoto2);
    ivPhoto3 = (ImageView)findViewById(R.id.ivPhoto3);

    new loadPage().execute(null, null, null);
}

public class loadPage extends AsyncTask<String, Integer, Void> {
        private ProgressDialog pdia;

    @Override
    protected void onPreExecute(){
        super.onPreExecute();
        pdia = new ProgressDialog(AppDetails.this);
        pdia.setMessage("Loading...");
        pdia.show(); 
        }

    @Override
    protected Void doInBackground(String... aurl) {
        SoapObject Request = new SoapObject (NAMESPACE, METHOD_NAME);

        Request.addProperty("title", getIntent().getExtras().getString("xdaTitle"));

        SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);

        soapEnvelope.dotNet = true;
        soapEnvelope.setOutputSoapObject(Request);

        AndroidHttpTransport aht = new AndroidHttpTransport(URL);

        try
        {
            aht.call(SOAP_ACTION, soapEnvelope);
            SoapObject resultString = (SoapObject) soapEnvelope.getResponse();

            for(int i =0; i<resultString.getPropertyCount(); i++)
            {
                SoapObject array = (SoapObject) resultString .getProperty(i);

                title = array.getProperty(1).toString(); 
                developer = array.getProperty(3).toString();    

                         //load images      
                photoURL1 = array.getProperty(5).toString();   //get logo url


                BitmapFactory.Options bmOptions;
                bmOptions = new BitmapFactory.Options();
                bmOptions.inSampleSize = 1;         

            }
        }
        catch(Exception e){                                             
        }           

        return null;
    }

    @Override
    protected void onProgressUpdate(Integer... progress2) {

    }


        @Override
        protected void onPostExecute(Void unused) {
            tvTitle.setText(title);
            tvDeveloper.setText(developer);
            BitmapFactory.Options bmOptions;
            bmOptions = new BitmapFactory.Options();
            bmOptions.inSampleSize = 1;

            Bitmap bmLogo = LoadImage(photoURL1, bmOptions);
            ivLogo.setImageBitmap(bmLogo);
            pdia.dismiss();
        }

Here is the problem.

  • my tvTitle only display first 3 characters, tvDeveloper only display 7~8 characters (tvtitle and tvDeveloper is a textView)
  • force closed occur if i move image loader from doInBackground to onPostExecute.

=======UPDATE: where should i park this code? =================

MyI = new Intent(Intent.ACTION_VIEW);
            MyI.setAction(android.content.Intent.ACTION_VIEW);
            MyI.setDataAndType(Uri.parse("file:///sdcard/MaxApps/" + apkURL.toString()), "application/vnd.android.package-archive");

            MyPI = PendingIntent.getActivity(getApplicationContext(), 0, MyI, 0);
            MyNM = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);

            Intent intent = new Intent(getApplicationContext(), AppDetails.class);
            intent.putExtra("xdaTitle", title);
            final PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), 0, intent, 0);

            notification = new Notification(R.drawable.logo, "Downloading...", System.currentTimeMillis());
            notification.flags = notification.flags | Notification.FLAG_ONGOING_EVENT;
            notification.contentView = new RemoteViews(getApplicationContext().getPackageName(), R.layout.downloadapk);
            notification.contentIntent = pendingIntent;
            notification.contentView.setImageViewResource(R.id.imgIcon, R.drawable.save);
            notification.contentView.setTextViewText(R.id.tvText, "Downloading " + apkURL);
            notification.contentView.setViewVisibility(R.id.pbStatus, View.VISIBLE);
            notification.contentView.setProgressBar(R.id.pbStatus, 100, progress, false);        
            notificationManager = (NotificationManager) getApplicationContext().getSystemService(getApplicationContext().NOTIFICATION_SERVICE);
melvintcs
  • 551
  • 3
  • 13
  • 34
  • post your layout xml file also, so that the text truncating can also be checked – sunil Jul 06 '12 at 07:03
  • What's your new code actually done? – user370305 Jul 06 '12 at 07:14
  • i bet there is another question, to make this thread easy to understand/clear, i have open a new question: http://stackoverflow.com/questions/11357721/notification-bar-in-asynctask , thx for the help thought :) – melvintcs Jul 06 '12 at 07:29

2 Answers2

2

Actually,

ivLogo.setImageBitmap(bmLogo);
ivPhoto1.setImageBitmap(bmPhoto1);
ivPhoto2.setImageBitmap(bmPhoto2);
ivPhoto3.setImageBitmap(bmPhoto3);

These lines in doInBackground() cause problem. Because You are trying to update MainUI thread from a worker thread(non UI Thread).

You can not update MainUI from doInBackground() of AsyncTask so better to put this UI update code in onPostExecute() of AsyncTask.

user370305
  • 108,599
  • 23
  • 164
  • 151
  • Make a Bitmap Array in your AsyncTask fill those array in doInBackground() and used that array in onPostExcute() so you can set it to ImageViews.. – user370305 Jul 06 '12 at 06:36
  • Return that array in doInBackground so you will get it as parameter in onPostExecute() – jpa Jul 06 '12 at 06:46
  • yes, i know. what i did is i store the URL into the string under 'doInBackground' and pass the url to onPostExecute() (like what i did to tvTitle) it makes the system force. i have update the code, please have a look :) – melvintcs Jul 06 '12 at 06:48
  • thx! i have fixed it. i have another small problem, i have a notification flag code (see updated), where should i paste it? before i used asynctask, i just put it under onCreate(); – melvintcs Jul 06 '12 at 07:14
  • What you want to achieve by that code? So we can suggest you a better option if available. – user370305 Jul 06 '12 at 07:15
1

You can not Change UI in a background thread.

The AsyncTask has a better option to update the UI while downloading, that's to use publishProgress()

You need to make few changes in your code like this to implement it.

        @Override 
        protected Void doInBackground(String... aurl) { 

                for(int i =0; i<resultString.getPropertyCount(); i++) 
                {                    
                    String logo_URL = array.getProperty(5).toString();   //get logo url 
                    bmLogo = LoadImage(logo_URL, bmOptions); 
                    String photo1_URL = array.getProperty(6).toString(); 
                    bmPhoto1 = LoadImage(photo1_URL, bmOptions); 
                    String photo2_URL = array.getProperty(7).toString(); 
                    bmPhoto2 = LoadImage(photo2_URL, bmOptions); 
                    String photo3_URL = array.getProperty(8).toString(); 
                    bmPhoto3 = LoadImage(photo3_URL, bmOptions); 
                    publishProgress(null);
                } 
            } 
            catch(Exception e){                                              
            }            

            return null; 
        } 

        @Override 
        protected void onProgressUpdate(Integer... progress2) { 
            ivLogo.setImageBitmap(bmLogo); 
            ivPhoto1.setImageBitmap(bmPhoto1); 
            ivPhoto2.setImageBitmap(bmPhoto2); 
            ivPhoto3.setImageBitmap(bmPhoto3); 
        } 
MKJParekh
  • 34,073
  • 11
  • 87
  • 98