android - 不使用 get() 方法从 AsyncTask 返回值

标签 android http android-asynctask

我试图从 DoInBackground 中的异步任务返回值,但调用 get() 方法卡住了我的 UI。如何将代码重写为回调方法? :

public class GetUrlDataTask extends AsyncTask<String, Integer, String> {
String response;
HttpUtils util;
@Override
protected String doInBackground(String... params) {
    try {
        util = new HttpUtils(params[0]);
        response = util.getContent();
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return response;
}

@Override
protected void onPostExecute(String result) {
    super.onPostExecute(result);
}

在我的 Activity 中,我得到的结果是 response = new GetUrlDataTask().execute("site").get;

最佳答案

如果异步任务要花费相当长的时间(通常是这样),则不应使用 .get()。

相反,您可以使用消息/处理程序/服务/等,或者您可以简单地使用 onPostExecute(Result) 方法。

编辑:新代码。根据您的描述,您似乎需要使用一个接口(interface)。

如果您需要在另一个类中使用 Asynctask,那么接口(interface)可能是您的最佳选择。

TestTask.java(您的独立异步任务):

import android.os.AsyncTask;

// Remember to change object type <> to what you need
public class TestTask extends AsyncTask<Object,Object,Object> {

    public interface OnTaskCompleted{
        void onTaskCompleted();
    }

    private OnTaskCompleted listener;

    public TestTask(OnTaskCompleted listener){
        this.listener = listener;
    }

    protected void onPostExecute(Object o){
        // Call the interface method
        if (listener != null)
            listener.onTaskCompleted();
    }

    @Override
    protected Object doInBackground(Object... params) {
        // The sleep() is just to simulate activity and delay
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return null;
    }
}

MainActivity.java(或任何其他 Activity ):

public class MainActivity extends Activity {

private boolean status = false;

private OnTaskCompleted listener = new OnTaskCompleted() {
    public void onTaskCompleted() {
        status = true;
        Toast.makeText(MainActivity.this, "Status: " + status, Toast.LENGTH_SHORT).show();
    }
};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toast.makeText(MainActivity.this, "Status: " + status, Toast.LENGTH_SHORT).show();
    new TestTask(listener).execute("Testing");
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

}

关于android - 不使用 get() 方法从 AsyncTask 返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19520188/

相关文章:

android - 如何在android中的方向变化中加载不同的xml文件

java - 滑动 Android 时通知不会消失

java - Android 倒计时无法正常工作,数字在 2 个值之间不断闪烁且时区无法正常工作

android - 如何从获取 NPE 的 Android Activity 调用另一个 Activity AsyncTask 类

android - 如何将新的Listview数据附加到无限滚动的ListView

android - HTML 格式在 android 上看起来不错,但在 iphone 上却不行

jquery - 为子域 B 设置子域 A 的 cookie

android - 网络通信中的 Activity 和 fragment 职责(robospice)

php - AJAX/PHP 为什么 HTTP 轮询如此缓慢?

android - AsyncTask 在 doInBackground() 中崩溃