Sep*_*phy 1 java static multithreading android visibility
我正在开发一个Android应用程序,试图处理线程而不是真的了解它们很多......(是的,我知道有点愚蠢)我会尝试正确地解释它并且很快.
在我的活动的onCreate方法中,我正在调用AlertDialog以使用户选择从Internet加载数据或使用先前存储在数据库中的数据直接访问应用程序.
为此,在onCreate中,我调用我的方法来引发AlertDialog,正向按钮应该启动工作线程下载,而否定按钮应该调用intent来移动到下一个活动.到目前为止,我得到了这个:
wait()任何地方,我的AlertDialog出现但无论如何线程都开始了 wait()我的线程的第一行,我必须声明它是静态的,以便从我的AlertDialog的监听器访问它并能够notify()它,或者interrupt(),我收到错误:object not locked by thread before wait().worker = new Thread(new Runnable() {
public void run() {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)
private void miseAJourDesDonnes() {
confirmInscrip = new AlertDialog.Builder(this).setMessage(
"Voulez-vous mettre à jour l'intégralité des données de l'application? (Connexion internet requise").setPositiveButton("Mettre à jour",
okListener).setNegativeButton("Continuer sans", nonListener);
confirmInscrip.create();
confirmInscrip.show();
}
OnClickListener okListener = new OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
Toast.makeText(AccueilSplash.this, "Mise à jour en cours", Toast.LENGTH_SHORT).show();
worker.notify();
return;
}
};
OnClickListener nonListener = new OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
Toast.makeText(AccueilSplash.this, "Accès direct à l'application", Toast.LENGTH_SHORT).show();
worker.interrupt();
Intent entre = new Intent(AccueilSplash.this, Androt.class);
startActivity(entre);
}
};
Run Code Online (Sandbox Code Playgroud)
工人是我的线程实例(bbackground one)我只是愚蠢还是有一种我没有掌握的弱点?谢谢你的回答......
下面是对wait()和notify()如何工作的快速解释,但我可能建议您不要创建工作线程,除非用户单击确定?您可能仍希望稍后取消该线程,如果他们想要停止下载,但在您知道是否要使用它之前创建该线程似乎不是最好的方法.
为了调用wait(),notify(),或者notifyAll()在一个对象上,你必须首先拥有你想要调用方法的对象的监视器,所以在你运行的情况下,这就是你需要做的事情:
Runnable runnable = new Runnable() {
public void run() {
// wait(); This call wouldn't work
syncronized (this) {
wait(); // This call will work
}
}
};
Run Code Online (Sandbox Code Playgroud)
要通知该runnable,您还必须拥有该监视器
// runnable.notifyAll(); this call will not work
syncronized (runnable) {
runnable.notifyAll(); // this call will work
}
Run Code Online (Sandbox Code Playgroud)
有关Java中的线程和并发性的更多信息,我建议使用Java Concurrency in Practice
在Android中可能有一些内置的后台任务框架,我不知道但是使用纯java这个最简单的方法似乎是这样的:
私有线程下载线程;
OnClickListener okListener = new OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
Runnable download = new Runnable() {
public void run() {
// Create your input streams and such
boolean downloadComplete = false;
while(!downloadComplete && !Thread.currentThread().isInterruped()) {
// Do some downloading
}
if (!Thread.currentThread().isInterruped()) {
// Alert user of success.
}
}
};
downloadThread = new Thread(download);
downloadThread.start();
}
};
OnClickListener cancelListener = new OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
downloadThread.interrupt();
}
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
15749 次 |
| 最近记录: |