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);
完成!