2 回答
TA贡献1836条经验 获得超13个赞
我更喜欢使用AsyncTask来做。
从链接复制粘贴:
AsyncTask 可以正确且轻松地使用 UI 线程。此类允许您在 UI 线程上执行后台操作并发布结果,而无需操作线程和/或处理程序。
AsyncTask 被设计为围绕 Thread 和 Handler 的辅助类,并不构成通用的线程框架。理想情况下,AsyncTasks 应该用于短期操作(最多几秒钟)。如果您需要让线程长时间运行,强烈建议您使用 java.util.concurrent 包提供的各种 API,例如Executor、ThreadPoolExecutor 和 FutureTask。
说了这么多,配置一个 AsyncTask 还是蛮简单的,只需要创建一个像下面这样的类:
private class LongOperation extends AsyncTask<String, Void, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
//this method works on the UI thread.
//this is the first to run before "doInBackground"
mTextView.setText("we start!");
}
@Override
protected String doInBackground(String... params) {
try {
//do whatever your async task needs to do. This method works async
//you can also call an UI callback from here with the publishProgress method. This will call the "onProgressUpdate" method, and it has to respect his type.
publishProgress("we go on!");
} catch (InterruptedException e) {
Thread.interrupted();
}
return "Executed";
}
@Override
protected void onPostExecute(String result) {
//this method works on the UI thread
//it get the "doInBackground" return value.
mTextView.setText(result);
}
@Override
protected void onPreExecute() {}
@Override
protected void onProgressUpdate(String... values) {
//this method works on UI thread, so it can access UI components and ctx
mTextView.setText(values[0]);
}
}
这是一个关于如何创建 AsyncTask 的基本示例,您可以像这样使用它(表单活动/片段):
AsyncTaskExample asyncTask = new AsyncTaskExample();
asyncTask.get(30000, TimeUnit.MILLISECONDS);
这将为您的异步操作设置超时。在这里查看确切的异常/返回
如有任何进一步的问题,请自由提问。希望这可以帮助
编辑:
我只是注意到你AsyncTask的线程里面有一个。由于AsyncTask 已经是 async,我会避免这样做,只需AsyncTask使用我之前给您的方法调用。这样,AsyncTask将运行到给定的 TimeSpan :)
TA贡献1836条经验 获得超4个赞
请参阅下面的代码:它可能对您有所帮助。
CountDownTimer timer = new CountDownTimer(3000,1000) {
@Override
public void onTick(long l) {
}
@Override
public void onFinish() {
//return a message here;
}
};
timer.start();
如果你有一个异步任务。然后在doInBackground方法中执行以下操作:
@Override
protected Void doInBackground(Void... voids) {
//simply do your job
CountDownTimer timer = new CountDownTimer(3000,1000) {
@Override
public void onTick(long l) {
}
@Override
public void onFinish() {
//return a message here;
return message;
}
};
timer.start();
return your_reult;
}
添加回答
举报