2014-12-10 4 views
1

У меня есть два потока. Один для увеличения значения. Для каждого приращения i neet должен быть уведомлен основной поток. Ниже моя главная тема, которая является деятельность поКак получать уведомления каждый раз, когда значение увеличивается

public class MainActivity extends Activity { 
    private ProgressBar progressBar; 
    private int progressStatus = 1; 
    private TextView textView; 
    private Handler handler = new Handler(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     progressBar = (ProgressBar) findViewById(R.id.progressBar1); 
     textView = (TextView) findViewById(R.id.textView1); 

     ProgressUpdate b = new ProgressUpdate(); 
     b.start(); 
     Log.e("SAMEERA", "Satrting ProgressUpdate"); 
     synchronized (b) { 
      try { 

       Log.e("SAMEERA", "synchronized synchronized"); 
       Log.e("SAMEERA", "progressStatus is "+b.total); 
       b.wait(); 


       Log.e("SAMEERA", "progressStatus is "+b.total); 
       progressBar.setProgress(progressStatus); 
       textView.setText(progressStatus + "/" + progressBar.getMax()); 
      } catch (InterruptedException e) { 
      } 
      System.out.println("Total is: " + b.total); 
     } 


    } 
} 

Ниже моя прибавка нить.

package com.example.zwtouch; 

import android.util.Log; 

public class ProgressUpdate extends Thread { 

    int total; 

    public void run() { 
     total=0; 
     synchronized (this) { 
      for (int i = 0; i < 100; i++) { 
       total += i; 
       try { 
        Thread.sleep(200); 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
       Log.e("SAMEERA", "run run total is "+i); 
       notify(); 
      } 

     } 
    } 

} 

Мне нужно уведомлен каждый раз, если общая сумма increased.But его не happening.After для цикла завершается он называет основной thread..where это ошибка?

ответ

3

Вариант 1

Использование Handler

  1. Populate ProgressUpdate с ProgressBar и Handler объектов.
  2. На каждом ходе использования Handler обновить ProgressBar

так:

public class ProgressUpdate extends Thread { 

    int total; 
    ProgressBar mProgressBar; 
    Handler mHandler; 

    public ProgressUpdate(Handler h, ProgressBar pb) { 
     mHandler = h; 
     mProgressBar = pb; 
    } 

    public void run() { 
     total=0; 
     for (int i = 0; i < 100; i++) { 
      // Update the progress bar via a Handler 
      mHandler.post(new Runnable() { 
       public void run() { 
        mProgressBar.setProgress(i); 
       } 
      }); 
     } 
    } 
} 

установки, как это

new ProgressUpdate(handler, progressBar).start(); 

Вариант 2 (рекомендуется)

Это другой подход. Для достижения этой цели вы можете использовать AsyncTask. Преимущество этого способа состоит в том, что как onProgressUpdate, так и onPostExecute работают на UI-Thread.

Сделать этот класс внутренний из MainActivity

private class ProgressUpdate extends AsyncTask<Void, Integer, Integer> { 

    protected Integer doInBackground(Void... dummy) { 
      int total = 0; 
      for (int i = 0; i < 100; i++) { 
       total += i; 
       try { 
        Thread.sleep(200); 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
       Log.e("SAMEERA", "run run total is "+i); 
       // Notify UI Thread 
       publishProgress(i); 
      } 
     return total; 
    } 

    protected void onProgressUpdate(Integer... i) { 
     // do something with 'i' on UI Thread 
     progressBar.setProgress(i);  
    } 

    protected void onPostExecute(Integer total) { 
     // do something with 'total' on UI Thread 
     // for instance 
     progressBar.setVisibility(View.GONE); 
    } 
    } 

Setup ProgressUpdate на OnCreate как этот

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // ... 
    new ProgressUpdate().execute(); 
    // ... 
} 
+0

На самом деле я не думаю, что это работает для моих case.I нужно показать progressbar для загрузки нескольких файлов. Поэтому, когда каждая загрузка завершается, он вызывает метод обратного вызова. Поэтому я могу обновить количество файлов, и мне нужно показать панель прогресса. –

+0

Тогда способ обработчика может помочь. Каждый раз, когда загрузка завершена, выполните mHandler.post, чтобы обновить основное действие. –

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