Asynctask из потока пользовательского интерфейса - PullRequest
0 голосов
/ 09 июля 2011

Я хотел бы маркировать класс AsyncTask для выполнения чего-либо в фоновом режиме, обновляя поток вызывающего процесса, но с потоком вызывающего! = Потока пользовательского интерфейса. Я пробовал этот код, но строка publishProgress (i), кажется, не имеет эффекта. Может кто-нибудь сказать мне, как я могу это исправить (или какой другой класс я могу использовать еще). Заранее спасибо =)

 public class MainUI extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        findViewById(R.id.button).setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View v) {
                Thread t=new Thread(){
                    boolean exit=false;
                    public void run(){
                        Looper.prepare();
                         new DownloadFilesTask().execute();

                         while (!exit){
                             try {
                                Thread.sleep(600);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                         }

                         Log.d("","Exit thread");

                        Looper.loop();
                    }

                    public void exit(){
                        exit=true;
                    }

                    class DownloadFilesTask extends AsyncTask<Void, Long, Long> {
                        protected Long doInBackground(Void... urls) {
                            long i=0;
                            for (i=0;i<20;i++){
                                 Log.d("",i+" ");
                                try {
                                    Thread.sleep(500);
                                } catch (InterruptedException e) {
                                    e.printStackTrace();
                                }
                                publishProgress(i);
                                }
                            return i;
                        }
                        protected void onProgressUpdate(Long... progress) {
                            Log.d("Test",progress[0]+"");
                                        }

                                        protected void onPostExecute(Long result) {
                                            exit();
                                        }
                                    }


                                };
                                t.start();


                            }

                        });
                    }





}

Ответы [ 2 ]

1 голос
/ 09 июля 2011

Создание потока для запуска ASyncTask бесполезно и не должно выполняться.Вы должны прочитать безболезненный документ по созданию потоков на сайте разработчика Android

http://android -developers.blogspot.com / 2009/05 / painless-threading.html

0 голосов
/ 29 октября 2011

Из документа Android:

Для правильной работы этого класса необходимо соблюдать несколько правил потоков:

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

execute(Params...) must be invoked on the UI thread.
Do not call onPreExecute(), onPostExecute(Result), doInBackground(Params...), onProgressUpdate(Progress...) manually.
The task can be executed only once (an exception will be thrown if a second execution is attempted.)

Таким образом, вы НЕ можете создать его вне потока пользовательского интерфейса.Вместо этого используйте Task и оберните его в объект ThreadPoolExecutor.Имейте в виду, что вам нужно сделать его поточно-ориентированным при обновлении пользовательского интерфейса, используя один из них:

Activity.runOnUiThread(Runnable)
View.post(Runnable)
View.postDelayed(Runnable, long)

Но, опять же, Asynctask бесполезен, и я НЕ рекомендую его.

Привет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...