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