package com.shizhefei.test.controllers.task; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.TextView; import com.google.gson.Gson; import com.shizhefei.mvc.ProgressSender; import com.shizhefei.mvc.RequestHandle; import com.shizhefei.mvc.ResponseSender; import com.shizhefei.task.Code; import com.shizhefei.task.IAsyncTask; import com.shizhefei.task.ITask; import com.shizhefei.task.TaskHelper; import com.shizhefei.task.imp.SimpleCallback; import com.shizhefei.test.models.datasource.okhttp.BooksOkHttp_AsyncDataSource; import com.shizhefei.test.models.datasource.okhttp.BooksOkHttp_SyncDataSource; import com.shizhefei.test.models.enties.Book; import com.shizhefei.test.models.enties.User; import com.shizhefei.test.models.task.LoginAsyncTask; import com.shizhefei.test.models.task.LoginTask; import com.shizhefei.view.mvc.demo.R; import java.util.List; public class TaskDemoActivity extends Activity { private View asyncDataSourceButton; private View taskButton; private View asyncTaskButton; private View dataSourceButton; private TaskHelper<Object> taskHelper; private TextView resultTextView; private TextView result2TextView; private View longTimeTask; private View longTimeAsyncTask; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_task_demo); asyncDataSourceButton = findViewById(R.id.taskdemo_iasyncdatasoruce_button); taskButton = findViewById(R.id.taskdemo_itask_button); asyncTaskButton = findViewById(R.id.taskdemo_iasynctask_button); dataSourceButton = findViewById(R.id.taskdemo_idatasoruce_button); longTimeTask = findViewById(R.id.taskdemo_longTimeTask_button); longTimeAsyncTask = findViewById(R.id.taskdemo_longTimeAsyncTask_button); resultTextView = (TextView) findViewById(R.id.taskdemo_result_textView); result2TextView = (TextView) findViewById(R.id.taskdemo_result2_textView); asyncDataSourceButton.setOnClickListener(onClickListener); taskButton.setOnClickListener(onClickListener); asyncTaskButton.setOnClickListener(onClickListener); dataSourceButton.setOnClickListener(onClickListener); longTimeTask.setOnClickListener(onClickListener); longTimeAsyncTask.setOnClickListener(onClickListener); taskHelper = new TaskHelper<>(); taskHelper.registerCallBack(new SimpleCallback<Object>() { @Override public void onPreExecute(Object task) { super.onPreExecute(task); result2TextView.setText("开始执行:" + task.getClass().getSimpleName()); } @Override public void onProgress(Object task, int percent, long current, long total, Object extraData) { super.onProgress(task, percent, current, total, extraData); result2TextView.append("\n progress percent:" + percent + " current:" + current + " total:" + total + " extraData:" + extraData); Log.d("zzzz", "registerCallBack progress:" + current); } @Override public void onPostExecute(Object task, Code code, Exception exception, Object data) { result2TextView.append("\n"); result2TextView.append("code:" + code); result2TextView.append("\n"); if (code == Code.SUCCESS) { result2TextView.append(new Gson().toJson(data)); } else if (code == Code.EXCEPTION) { result2TextView.append(exception.getMessage()); } } }); } @Override protected void onDestroy() { super.onDestroy(); //取消全部 taskHelper.destroy(); } private View.OnClickListener onClickListener = new View.OnClickListener() { @Override public void onClick(View v) { //取消全部 taskHelper.cancelAll(); if (v == asyncDataSourceButton) { taskHelper.execute(new BooksOkHttp_AsyncDataSource(), new SimpleCallback<List<Book>>() { @Override public void onPreExecute(Object task) { super.onPreExecute(task); resultTextView.setText("正在执行asyncDataSourceButton"); } @Override public void onPostExecute(Object task, Code code, Exception exception, List<Book> books) { resultTextView.append("\n"); resultTextView.append("code:" + code); resultTextView.append("\n"); if (code == Code.SUCCESS) { resultTextView.append(new Gson().toJson(books)); } else if (code == Code.EXCEPTION) { resultTextView.append(exception.getMessage()); } } }); } else if (v == dataSourceButton) { taskHelper.execute(new BooksOkHttp_SyncDataSource(), new SimpleCallback<List<Book>>() { @Override public void onPreExecute(Object task) { super.onPreExecute(task); resultTextView.setText("正在执行SyncDataSource"); } @Override public void onPostExecute(Object task, Code code, Exception exception, List<Book> books) { resultTextView.append("\n"); resultTextView.append("code:" + code); resultTextView.append("\n"); if (code == Code.SUCCESS) { resultTextView.append(new Gson().toJson(books)); } else if (code == Code.EXCEPTION) { resultTextView.append(exception.getMessage()); } } }); } else if (v == asyncTaskButton) { taskHelper.execute(new LoginAsyncTask("LuckyJayce", "111"), new SimpleCallback<User>() { @Override public void onPreExecute(Object task) { super.onPreExecute(task); resultTextView.setText("正在执行asyncTaskButton"); } @Override public void onPostExecute(Object task, Code code, Exception exception, User user) { resultTextView.append("\n"); resultTextView.append("code:" + code); resultTextView.append("\n"); if (code == Code.SUCCESS) { resultTextView.append(new Gson().toJson(user)); } else if (code == Code.EXCEPTION) { resultTextView.append(exception.getMessage()); } } }); } else if (v == taskButton) { taskHelper.execute(new LoginTask("LuckyJayce", "111"), new SimpleCallback<User>() { @Override public void onPreExecute(Object task) { super.onPreExecute(task); resultTextView.setText("正在执行taskButton"); } @Override public void onPostExecute(Object task, Code code, Exception exception, User user) { resultTextView.append("\n"); resultTextView.append("code:" + code); resultTextView.append("\n"); if (code == Code.SUCCESS) { resultTextView.append(new Gson().toJson(user)); } else if (code == Code.EXCEPTION) { resultTextView.append(exception.getMessage()); } } }); } else if (v == longTimeTask) { taskHelper.execute(new LongTimeTask(), null); } else if (v == longTimeAsyncTask) { taskHelper.execute(new LongTimeAsyncTask(), null); } } }; private static class LongTimeTask implements ITask<String> { @Override public String execute(ProgressSender progressSender) throws Exception { for (int i = 0; i < 20; i++) { Thread.sleep(1000); Log.d("zzzz", "IAsyncTask progress:" + i); progressSender.sendProgress(i, 20, null); } return "完成"; } @Override public void cancel() { //这里故意不写取消的方法,测试任务没有被取消一直执行 // 会不会导致Activity和Callback有没有被强引用而gc不了 } } private static class LongTimeAsyncTask implements IAsyncTask<String> { @Override public RequestHandle execute(final ResponseSender<String> sender) throws Exception { new Thread() { @Override public void run() { super.run(); try { for (int i = 0; i < 20; i++) { Thread.sleep(1000); Log.d("zzzz", "IAsyncTask progress:" + i); sender.sendProgress(i, 20, null); } sender.sendData("完成"); } catch (Exception e) { e.printStackTrace(); sender.sendError(e); } } }.start(); //这里故意不写取消的RequestHandle对象返回null,测试任务没有被取消一直执行 // 会不会导致Activity和Callback有没有被强引用而gc不了 return null; } } }