Я пишу простое приложение для Android, чтобы продемонстрировать методы wait() и notify(). Приложение содержит 1 кнопку и 1 textView, textView покажет таймер, и кнопка отобразит диалог, содержащий 2 кнопки. теперь то, что я хочу сделать, - это когда я нажимаю кнопку диалога, паузу времени и всякий раз, когда я возвращаюсь, нажимая кнопку возобновления в диалоговом окне, время продолжается и так далее.это право для wait() и notify() и как исправить
Вот мой код:
public class MainActivity extends Activity implements OnClickListener{
Timer t;
int count = 0;
Button b;
TextView tv;
Thread thread;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
b = (Button) findViewById(R.id.button1);
tv = (TextView) findViewById(R.id.textView1);
t = new Timer();
t.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
// TODO Auto-generated method stub
runOnUiThread(new Runnable() {
public void run() {
tv.setText(String.valueOf(count));
count++;
}
});
}
}, 1000, 1000);
b.setOnClickListener(this);
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
synchronized (MainActivity.this)
{
try {
wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
final Dialog d = new Dialog(this);
d.setTitle("Pause Menu");
d.setContentView(R.layout.pausemenu);
Button b1 = (Button) d.findViewById(R.id.Resume);
Button b2 = (Button) d.findViewById(R.id.Main);
b1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
d.cancel();
thread = new Thread()
{
public void run()
{
synchronized (MainActivity.this) {
try {
wait(1000);
}catch (Exception e) {
// TODO: handle exception
}
notify();
}
}
};
}
});
b2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
d.cancel();
}
});
d.show();
}
}
и вот LogCat:
06-09 08:07:55.066: E/AndroidRuntime(635): FATAL EXCEPTION: main
06-09 08:14:43.946: E/AndroidRuntime(664): FATAL EXCEPTION: main
06-09 08:14:43.946: E/AndroidRuntime(664): java.lang.NullPointerException
06-09 08:14:43.946: E/AndroidRuntime(664):
at com.example.timerwithnotify.MainActivity.onClick(MainActivity.java:58)
06-09 08:14:43.946: E/AndroidRuntime(664):
at android.view.View.performClick(View.java:2408)
06-09 08:14:43.946: E/AndroidRuntime(664):
at android.view.View$PerformClick.run(View.java:8816)
06-09 08:14:43.946: E/AndroidRuntime(664):
at android.os.Handler.handleCallback(Handler.java:587)
06-09 08:14:43.946: E/AndroidRuntime(664):
at android.os.Handler.dispatchMessage(Handler.java:92)
06-09 08:14:43.946: E/AndroidRuntime(664): at android.os.Looper.loop(Looper.java:123)
06-09 08:14:43.946: E/AndroidRuntime(664):
at android.app.ActivityThread.main(ActivityThread.java:4627)
06-09 08:14:43.946: E/AndroidRuntime(664):
at java.lang.reflect.Method.invokeNative(Native Method)
06-09 08:14:43.946: E/AndroidRuntime(664):
at java.lang.reflect.Method.invoke(Method.java:521)
06-09 08:14:43.946: E/AndroidRuntime(664):
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
06-09 08:14:43.946: E/AndroidRuntime(664):
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
пожалуйста, покажите мне в коде, как это исправить, им еще нуб: D. Спасибо за ваше время и внимание.
final Диалог d = новый Диалог (это); должен быть окончательным Диалог d = новый диалог (MainActivity.this); – Raghunandan
Также, если вы реализуете Thread или HandlerThread, убедитесь, что поток пользовательского интерфейса не блокируется в ожидании завершения рабочего потока - не вызывайте Thread.wait() или Thread.sleep(). Проверьте это http://developer.android.com/training/articles/perf-anr.html – Raghunandan
та же проблема :( – Coderji