Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/209.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在每次价值增加时得到通知_Java_Android_Multithreading - Fatal编程技术网

Java 如何在每次价值增加时得到通知

Java 如何在每次价值增加时得到通知,java,android,multithreading,Java,Android,Multithreading,我有两个线程。一个用于递增值。对于每个递增,我需要得到主线程的通知。 下面是我的主线,这是一个活动 public class MainActivity extends Activity { private ProgressBar progressBar; private int progressStatus = 1; private TextView textView; private Handler handler = new Handler(); @

我有两个线程。一个用于递增值。对于每个递增,我需要得到主线程的通知。 下面是我的主线,这是一个活动

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();
            }

        }
    }

}
package com.example.zwtouch;
导入android.util.Log;
公共类ProgressUpdate扩展了线程{
整数合计;
公开募捐{
总数=0;
已同步(此){
对于(int i=0;i<100;i++){
总数+=i;
试一试{
睡眠(200);
}捕捉(中断异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
Log.e(“SAMEERA”,“运行总数为”+i);
通知();
}
}
}
}
如果总数增加,我每次都需要得到通知。但是没有发生。for循环完成后,它会调用主线程。错误在哪里?

选项1 使用

  • 使用
    ProgressBar
    Handler
    对象填充
    ProgressUpdate
  • 在每次进度中,使用
    处理程序
    更新
    进度条
  • 像这样:

    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);
                   }
               });
            }
        }
    }
    
    备选案文2(建议) 这是实现这一目标的另一种方法。这种方式的优点是
    onProgressUpdate
    onPostExecute
    都在UI线程上运行

    将此类设置为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);
         }
      }
    

    事实上,我认为这不适合我的情况。我需要显示progressbar以下载多个文件。因此,每次下载完成后,它都会触发回调方法。因此,我可以更新文件计数,我需要显示progressbar。然后处理程序方式可能会有所帮助。每次下载完成后,执行mHandler.post更新主要活动。
    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);
         }
      }
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // ... 
        new ProgressUpdate().execute();
        // ...
    }