在Asynctask中执行繁重的服务器任务。 一旦部分数据被下载,我需要调用一个处理主线程上的一些ui元素的方法。 但它不适合我。屏幕保持自由zed,直到它完成异步任务。 那么我如何才能在主线程上运行该方法,并且我的后台任务也应该正在运行?
这是我的代码
public class AsyncgetTestDetailsfromServer extends AsyncTask<Void ,Void,Integer>
{
@Override
protected Integer doInBackground(Void... params) {
Ion.with(TestActivity.this)
.load(AppConstants.GET_TEST_QUESTION_ANSWER+"testID="+Test_id)
.setTimeout(30000)
.asString().setCallback(new FutureCallback<String>() {
@Override
public void onCompleted(Exception e, String response) {
if (e != null) {
e.printStackTrace();
displayAlert(TestActivity.this,
getString(R.string.app_name),
getString(R.string.strInternetSlow), "0");
}
if(response!=null){
try {
JSONArray jsonArray = new JSONArray(response);
for(int i=0;i<jsonArray.length();i++){
JSONObject jsonObject = (JSONObject) jsonArray.get(i);
String result = jsonObject.getString("TransactionStatus");
if(result.equals("Success"))
{
JSONArray testArray = (JSONArray) jsonObject.get("TestDetails");
for(int j=0;j<testArray.length();j++)
{
JSONObject obj = (JSONObject) testArray.get(j);
JSONArray SubjectArray = (JSONArray) obj.get("SubjectList");
QueCount=0;
for(int k=0;k<SubjectArray.length();k++)
{
JSONObject SubObj = (JSONObject) SubjectArray.get(k);
JSONArray QuestionArray = (JSONArray) SubObj.get("QuestionList");
if (QuestionArray != null && QuestionArray.length() > 0) {
for(int l=0;l<QuestionArray.length();l++)
{
QueCount++;
// Contains some database operations...
if(QueCount==51)
{
TestActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
DisplayQuestion();
BaseActivity.StopLoadingDialog();
StartTimer();
}
});
}
}
if(QueCount<=50){
DisplayQuestion();
BaseActivity.StopLoadingDialog();
StartTimer();
}
}
else
{
displayAlert(act,
getString(R.string.app_name),
getString(R.string.strNoQuestionFound), "1");
}
}
}
}
if(result.equals("Error"))
{
int ErrorCode = jsonObject.getInt("ERROR");
showErrorMessage(ErrorCode,TestActivity.this);
}
}
} catch (JSONException e1) {
e1.printStackTrace();
}
}
}
});
return QueCount;
}
}
并致电
new AsyncgetTestDetailsfromServer().execute();
答案 0 :(得分:1)
当你拥有callback
功能时,为什么你在后台工作只需删除asyncTask
代码,从下面的代码开始,
我的代码可以在没有
asyncTask
的情况下工作,因为我可以看到CallBack
方法。
Ion.with(TestActivity.this)
.load(AppConstants.GET_TEST_QUESTION_ANSWER+"testID="+Test_id)
.setTimeout(30000)
.asString().setCallback(new FutureCallback<String>() {
@Override
public void onCompleted(Exception e, String response) {
if (e != null) {
e.printStackTrace();
displayAlert(TestActivity.this,
getString(R.string.app_name),
getString(R.string.strInternetSlow), "0");
}
..................
,,,,,
...................
....................
在
中使用async if(response!=null){
try {
//Use asyncTask here...
}
答案 1 :(得分:1)
我真的不知道你的回调是如何工作的,但屏幕可能因此而冻结。 Asynctask实现了一个onPostExecute方法,您可以在其中使用回调。
回调界面:
public interface AsyncTaskCompleteListener<T> {
public void onTaskComplete(T result, int number);
}
AsyncTask:
public class LoadURL extends AsyncTask<String, Process, String> {
private AsyncTaskCompleteListener<String> callback;
public LoadURL(AsyncTaskCompleteListener<String> cb) {
this.callback = cb;
}
protected void onPreExecute() {}
protected String doInBackground(String... arg0) {
// do something
return content;
}
protected void onPostExecute(String content) {
if (callback != null)
callback.onTaskComplete(content,number);
}
}
活动:
public class LoginActivity extends Activity implements AsyncTaskCompleteListener<String> {
@Override
protected void onCreate(Bundle savedInstanceState) {
LoadURL loadUrl = new LoadURL(LoginActivity.this);
loadUrl.execute(...);
}
@Override
public void onTaskComplete(String result, int number) {...}
}
我的代码从来没有遇到任何冻结问题。希望这会有所帮助