执行异步任务时屏幕冻结

时间:2015-03-04 07:31:44

标签: android

在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();

2 个答案:

答案 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) {...}
}

我的代码从来没有遇到任何冻结问题。希望这会有所帮助