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

Sun*_*ike 3 android http android-asynctask

我正在尝试从DoInBackground中的asynctask返回值,但调用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);
}
Run Code Online (Sandbox Code Playgroud)

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

Ale*_*kin 10

[更新]现在我建议使用注释.使用注释,您可以注入视图,只需几个字母就可以在编译步骤中将函数作为异步过程.查看github上的butterknife库.

牛油刀

您可以创建接口,将其传递给AsyncTask(在构造函数中),然后在onPostExecute中调用方法

例如:

你的界面:

public interface OnTaskCompleted{
    void onTaskCompleted();
}
Run Code Online (Sandbox Code Playgroud)

你的活动:

public YourActivity implements OnTaskCompleted{
    //your Activity
}
Run Code Online (Sandbox Code Playgroud)

而你的AsyncTask:

public YourTask extends AsyncTask<Object,Object,Object>{ //change Object to required type
    private OnTaskCompleted listener;

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

    //required methods

    protected void onPostExecute(Object o){
        //your stuff
        listener.onTaskCompleted();
    }
}
Run Code Online (Sandbox Code Playgroud)


Mat*_*eph 6

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

相反,您可以使用消息/处理程序/服务/等,也可以只使用onPostExecute(Result)方法.

编辑:新代码.根据您的描述,您似乎需要使用界面.

如果你需要在另一个类中使用Asynctask,那么接口可能是你最好的选择.

TestTask.java(你单独的Asynctask):

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

MainActivity.java(或任何其他活动):

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;
}

}
Run Code Online (Sandbox Code Playgroud)