2012-05-31 7 views
0

У меня есть класс, в котором я должен выполнить 3 длительные операции. И должен показать индикатор выполнения с интервалами 25%, 50%, 75% и 100%.Asynctask Строка выполнения не отображается правильно

Поскольку операции используют поток пользовательского интерфейса, я не могу поместить их в методе DoinBackground() ..

Я размещая opeartions в методе progressUpdate

код

package com.integrated.mpr; 

import org.apache.commons.math.linear.RealMatrix; 
import org.apache.commons.math.stat.correlation.Covariance; 
import org.apache.commons.math.stat.correlation.PearsonsCorrelation; 
import org.apache.commons.math.util.FastMath; 



public class Logic extends Activity{ 





    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.progress); 

     String x = "abc"; 
     new loadSomeStuff().execute(x); 

    } 

    public class loadSomeStuff extends AsyncTask<String,Integer,String>{ 

     ProgressDialog dialog; 

     protected void onPreExecute(){ 

      dialog = new ProgressDialog(Logic.this); 
      dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); 
      dialog.setMax(100); 
      dialog.show(); 

     } 



     @Override 
     protected String doInBackground(String... params) { 
      // TODO Auto-generated method stub 


      publishProgress(25); 

      publishProgress(50); 

      publishProgress(75); 

      publishProgress(100); 
      return null; 




     } 



     protected void onProgressUpdate(Integer...progress){ 


      if(progress[0]==25){ 

       dialog.incrementProgressBy(25); 
       Log.d("now in ", "25 loop"); 

       // do some long work in loop1 


       dialog.incrementProgressBy(25); 
      } 

      else if(progress[0]==25){ 

       dialog.incrementProgressBy(25); 
       Log.d("now in ", "50 loop"); 

       // do some long work in loop2 

       dialog.incrementProgressBy(25); 
      } 

      else if (progress[0] == 75){ 

       dialog.incrementProgressBy(25); 
       // do some long work in loop3 

      } 
      else{ 
       dialog.incrementProgressBy(25); 
      } 
     } 

     protected void onPostExecute(String result){ 


      dialog.dismiss(); 
      Intent openList = new Intent("com.integrated.mpr.SENSITIVELIST"); 
      startActivity(openList); 

     } 

    } 
}  

Теперь, когда я запускаю это, появляется пустой экран, и прогресс отображается только на 100%. Как я могу исправить это? пожалуйста, помогите

+0

http://samir-mangroliya.blogspot.in/p/android-asynctask-example.html –

+0

Я думаю, что мой код принципиально правильный, но plz исправить ошибку в моем коде. – Kumar

+0

@see и попробуйте сами, мы здесь для рефренсов и решателей проблем. –

ответ

-1

Вы не должны использовать нить ui для вычисления длительной работы. Ваши длинные операции должны выполняться в doinbackground, который будет выполнять их в другом потоке.

Редактировать: Я думаю, проблема в том, что вы действительно хотите работать с нитью по любой причине. Если это так, возможно, обработчик будет более подходящим.

http://developer.android.com/reference/android/os/Handler.html

+0

это именно то, что он делает – thepoosh

+0

вот в чем проблема .. мой код таков, что я должен использовать поток пользовательского интерфейса для длительных операций – Kumar

+0

Нет, не делайте этого. Если вы долго работаете в потоке ui, диспетчер активности запустит диалоговое окно NRA (не реагирующее приложение), и пользователям будет предложен вариант, чтобы убить ваше приложение. – Gomoku7

0

Прежде всего вы делаете некоторые большие ошибки.

onProgressUpdate используется для обновления пользовательского интерфейса, поэтому вам не нужно долго работать над этим методом. Вся долгая работа, которую вы должны сделать в doInBackground, и когда вы закончите ее часть, вы можете вызвать onProgressUpdate для обновления пользовательского интерфейса.

Также

Теперь, когда я запускаю это появляется пустой экран, и прогресс отображается только для 100%

Это потому, что вы не делаете никакой работы, и ваш телефон быстро: P Попробуйте поставить Thread.sleep (1000) betweek каждый вызов onProgressUpdate :)

Чем вы замените сон реальной работой!

+0

Проще говоря, у вас есть 4 цикла, которые используют поток пользовательского интерфейса, я хочу отобразить индикатор выполнения на 25%, 50%, 75%, 100, соответствующий этому. Как бы вы это сделали? – Kumar

+0

Пожалуйста, не оценивайте отрицательный результат, если вы не знаете, о чем говорите. Мы только что объяснили вашу проблему, что вам нужно сделать, а также где вы ошибаетесь в своем коде. Вам не нужно долго работать в потоке пользовательского интерфейса, или ваши приложения будут неактивны, и пользователь будет жаловаться на это. Как я уже сказал, вся тяжелая работа должна быть выполнена в doInBackground. Пожалуйста, постарайся сделать то, что я только что сказал. Поместите Thread.sleep между вызовами onProgressUpdate, и вы подделаете работу, и вы поймете, как это работает. – StErMi

+1

Прежде всего, я не оценил u отрицательный, у меня нет такой репутации, чтобы оценить any1. Да, я пробовал только метод сна. – Kumar

Смежные вопросы