基本上,我是否必须将要在 doInBackground 内的另一个线程上运行的代码放入 doInBackground 中,或者我可以在 doInBackground 内调用另一个函数/类/whatever-it-is-functions-are-known-in-JAVA 并拥有它异步运行? IE:(我在网上找到的示例代码)
protected String doInBackground(String... params) {
for(int i=0;i<5;i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
TextView txt = (TextView) findViewById(R.id.output);
txt.setText("Executed");
return null;
}
这是我看到的完成方式,但我可以这样做:
protected String doInBackground(String... params) {
postToServer(x,y,z,h);
}
让它调用我已经编写的函数,然后让该函数在另一个线程中运行?有时我的 HTTP 服务器响应有点慢(目前它只是一个低级测试服务器),如果我的 postToServer() 调用花费超过 5 秒,Android 会自动弹出终止进程框,并且还会禁用我的 UI,直到postToServer() 调用完成。这是一个问题,因为我正在开发一个 GPS 跟踪应用程序(在我工作的公司内部),并且关闭跟踪的 UI 选项会卡住,直到我的 postToServer() 完成为止,而这种情况有时不会发生。如果这个问题得到解答,我深表歉意,我尝试搜索,但没有找到任何可以按照我希望的方式实现此目的的示例。
最佳答案
您可以这样做,但您必须将 UI 更新移至 onPostExecute
,因为它在 UI 线程上运行。
public MyAsyncTask extends AsyncTask<foo, bar, baz> {
...
protected String doInBackground(String... params) {
postToServer(x,y,z,h);
}
protected void onPostExecute(Long result) {
TextView txt = (TextView) findViewById(R.id.output);
txt.setText("Executed");
}
....
}
您可能希望将 TextView 传递给 AsyncTask
的构造函数并将其存储为 WeakReference。
私有(private)最终 WeakReference textViewReference;
public MyAsyncTask(TextView txt) {
textViewReference = new WeakReference<TextView>(txt);
}
然后在 onPostExecute 中,您将确保 TextView 引用仍然存在。
protected void onPostExecute(Long result) {
TextView txt = textViewReference.get();
if (txt != null)
txt.setText("Executed");
}
如果您想通知用户任务正在执行,我会将其放在调用 AsyncTask
之前。
myTextView.setText("Update in progress...");
new MyAsyncTask().execute();
然后在 onPostExecute
中将 TextView
设置为“更新完成”。
关于android - AsyncTask 调用类中的另一个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13574462/