android - AsyncTask 调用类中的另一个函数

标签 android android-asynctask

基本上,我是否必须将要在 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/

相关文章:

android - 无法在 OpenGL ES 2.0 for Android 中绘制正方形,但可以绘制三角形

android - 通过蓝牙在配对的 Android 和 Raspberry PI 之间传输数据

java - 在执行其他代码之前如何完成 AsyncTask

java - 运行多个 Firestore 查询并等待所有查询完成

java - super.onCreate(savedInstanceState) 错误

php - Android GCM 中的通知生成问题

android - 从 Activity 完成 2 个 AsyncTask 后如何启动新 Activity ?

android - AsyncTask 取消自身仍然调用 onPostExecute()

android - 在哪里/如何在 TabActivity 中实现 SQLiteDatabase 和 AsyncTask

android - Droidgap 错误在 Phonegap Android 应用程序中没有这样的文件或目录