我正在开发一个Android项目,我有一个帖子发布到PHP API并检查响应。
在线程开始之前,我会显示一个可以取消的进度对话框。按下取消时,我拨打thread.stop()
,但这显示为已弃用。
我在Google上找到的所有内容都表明我有一个标志并检查while循环中的标志并干净利落地出来,但是在我的情况下没有循环,所以我应该怎么做呢? / p>
答案 0 :(得分:1)
您遇到的问题是因为threads are not supposed to be stopped by calling thread.stop();
方法而知道问题。
Android也不鼓励在Android中使用Java Threads,而且方便的是,Android在Threads之间进行通信时还有一些额外的支持,Handler类提供了一个整齐的排队消息机制,而Looper提供了一个方便的方法来处理它。
但正如您所提到的,您希望显示可以取消的进度对话框。按下取消时,可以使用AsyncTask
实现此类功能。
由于AsyncTask
是在Android中实现并行性的最简单方法之一,而无需处理更复杂的方法,如Threads
。
虽然它提供了与UI线程基本的并行度,但它不应该用于更长的操作(例如,不超过2秒)。
主要是AsyncTask应该处理你的问题,因为:
- 它提供了简单且标准的推荐机制来发布后台进度(请参阅此处的用法部分: http://developer.android.com/reference/android/os/AsyncTask.html)
- 它提供方法取消(布尔);取消任务(请参阅此处的取消任务部分: http://developer.android.com/reference/android/os/AsyncTask.html
醇>
AsyncTask有四种方法来完成任务:
onPreExecute();
doInBackground();
onProgressUpdate();
onPostExecute();
和cancel();
方法来处理后台工作的取消。
doInBackground()是最重要的,因为它是执行后台计算的地方。
<强>代码:强> 这是一个带有解释的骨架代码大纲:
public class AsyncTaskTestActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// This starts the AsyncTask
// Doesn't need to be in onCreate()
new DownloadFilesTask().execute(url1);
}
// Here is the AsyncTask class:
//
// AsyncTask<Params, Progress, Result>.
// Params – the type (Object/primitive) you pass to the AsyncTask from .execute()
// Progress – the type that gets passed to onProgressUpdate()
// Result – the type returns from doInBackground()
// Any of them can be String, Integer, Void, etc.
private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
protected Long doInBackground(URL... urls) {
int count = urls.length;
long totalSize = 0;
for (int i = 0; i < count; i++) {
totalSize += Downloader.downloadFile(urls[i]);
publishProgress((int) ((i / (float) count) * 100));
// Escape early if cancel() is called
if (isCancelled()) break;
}
return totalSize;
}
protected void onProgressUpdate(Integer... progress) {
setProgressPercent(progress[0]);
}
protected void onPostExecute(Long result) {
showDialog("Downloaded " + result + " bytes");
}
}
}
有关更深入的知识,请访问以下链接:
https://blog.nikitaog.me/2014/10/11/android-looper-handler-handlerthread-i/ http://developer.android.com/reference/android/os/AsyncTask.html