Android的asynctask发送callback给UI

我有以下asynctask类不在活动内。 在这个活动中,我正在初始化asynctask,并且我想让asynctask把callback报告给我的活动。 可能吗? 或者,asynctask必须与活动在同一个类文件中?

protected void onProgressUpdate(Integer... values) { super.onProgressUpdate(values); caller.sometextfield.setText("bla"); } 

像这样的东西?

您可以创build一个interface ,将其传递给AsyncTask (在构造函数中),然后在onPostExecute()方法中调用方法

例如:

你的界面:

 public interface OnTaskCompleted{ void onTaskCompleted(); } 

您的活动:

 public class YourActivity implements OnTaskCompleted{ // your Activity } 

和你的AsyncTask:

 public class 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(); } } 

编辑

由于这个答案很受欢迎,我想添加一些东西。

如果您是Android开发人员的新手,则AsyncTask是一种快速的方法,可以在不阻塞UI线程的情况下工作。 它确实解决了一些问题,class级如何运作本身并没有错。 但是,它带来了一些影响,如:

  • 内存泄漏的可能性。 如果您继续参考您的Activity ,即使在用户离开屏幕(或旋转设备)后,它仍会保留在内存中。
  • 如果Activity已经被销毁, AsyncTask不会将结果传递给Activity 。 你必须添加额外的代码来pipe理所有这些东西,或者做两次操作。
  • 卷积代码,它在Activity做所有事情

如果你觉得自己已经足够成熟,可以继续使用Android,那么看看这篇文章 ,我认为这是一个更好的方法,可以用asynchronous操作来开发Android应用程序。

我觉得下面的方法很简单。

我已经声明了一个callback接口

 public interface AsyncResponse { void processFinish(Object output); } 

然后创build用于响应所有types的并行请求的asynchronous任务

  public class MyAsyncTask extends AsyncTask<Object, Object, Object> { public AsyncResponse delegate = null;//Call back interface public MyAsyncTask(AsyncResponse asyncResponse) { delegate = asyncResponse;//Assigning call back interfacethrough constructor } @Override protected Object doInBackground(Object... params) { //My Background tasks are written here return {resutl Object} } @Override protected void onPostExecute(Object result) { delegate.processFinish(result); } } 

然后在Activity类中单击button时调用asynchronous任务。

 public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { Button mbtnPress = (Button) findViewById(R.id.btnPress); mbtnPress.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { MyAsyncTask asyncTask =new MyAsyncTask(new AsyncResponse() { @Override public void processFinish(Object output) { Log.d("Response From Asynchronous task:", (String) output); mbtnPress.setText((String) output); } }); asyncTask.execute(new Object[] { "Youe request to aynchronous task class is giving here.." }); } }); } } 

谢谢

在完成以上答案后,您还可以为每个asynchronous调用自定义回退,以便对通用ASYNC方法的每个调用都将填充不同的数据,具体取决于您放置的onTaskDone内容。

  Main.FragmentCallback FC= new Main.FragmentCallback(){ @Override public void onTaskDone(String results) { localText.setText(results); //example TextView } }; new API_CALL(this.getApplicationContext(), "GET",FC).execute("&Books=" + Main.Books + "&args=" + profile_id); 

提醒:我在主要来源的主要活动上使用了界面,如下所示:

 public interface FragmentCallback { public void onTaskDone(String results); } 

我的API发布执行如下所示:

  @Override protected void onPostExecute(String results) { Log.i("TASK Result", results); mFragmentCallback.onTaskDone(results); } 

API构造函数如下所示:

  class API_CALL extends AsyncTask<String,Void,String> { private Main.FragmentCallback mFragmentCallback; private Context act; private String method; public API_CALL(Context ctx, String api_method,Main.FragmentCallback fragmentCallback) { act=ctx; method=api_method; mFragmentCallback = fragmentCallback; } 

我会重复别人所说的,但只是试图简化一下…

首先,创build接口类

 public interface PostTaskListener<K> { // K is the type of the result object of the async task void onPostTask(K result); } 

其次,通过包含具体类来创build使用接口的AsyncTask(可以是您的活动或片段的内部静态类)。 在这个例子中,PostTaskListener是用String参数化的,这意味着它需要一个String类作为asynchronous任务的结果。

 public static class LoadData extends AsyncTask<Void, Void, String> { private PostTaskListener<String> postTaskListener; protected LoadData(PostTaskListener<String> postTaskListener){ this.postTaskListener = postTaskListener; } @Override protected void onPostExecute(String result) { super.onPostExecute(result); if (result != null && postTaskListener != null) postTaskListener.onPostTask(result); } } 

最后,把你的逻辑结合起来。 在您的活动/片段中,创buildPostTaskListener并将其传递给asynchronous任务。 这里是一个例子:

 ... PostTaskListener<String> postTaskListener = new PostTaskListener<String>() { @Override public void onPostTask(String result) { //Your post execution task code } } // Create the async task and pass it the post task listener. new LoadData(postTaskListener); 

完成!