Android 执行异步任务时屏幕冻结

Android 执行异步任务时屏幕冻结,android,Android,我在Asynctask中执行繁重的服务器任务。 一旦下载了部分数据,我就需要调用一个方法来处理主线程上的一些ui元素。 但这对我来说不起作用。屏幕在完成异步任务之前保持空闲状态。 那么,我如何使该方法在主线程上运行,而我的后台任务也应该在运行呢 这是我的密码 public class AsyncgetTestDetailsfromServer extends AsyncTask<Void ,Void,Integer> { @Override protected In

我在Asynctask中执行繁重的服务器任务。 一旦下载了部分数据,我就需要调用一个方法来处理主线程上的一些ui元素。 但这对我来说不起作用。屏幕在完成异步任务之前保持空闲状态。 那么,我如何使该方法在主线程上运行,而我的后台任务也应该在运行呢

这是我的密码

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;
    }
}

当您有
回调
函数时,为什么要在后台工作,只需删除
异步任务
代码,从下面的代码开始

您的代码将在没有
asyncTask
的情况下工作,因为
回调
方法


我真的不知道你的回调是如何工作的,但屏幕可能会因此冻结。Asynctask实现了一个onPostExecute方法,您可以在其中使用回调

回调接口:

public interface AsyncTaskCompleteListener<T> {
    public void onTaskComplete(T result, int number);
}
公共接口AsyncTaskCompleteListener{
公共void onTaskComplete(T结果,整数);
}
异步任务:

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) {...}
}
公共类LoadURL扩展异步任务{
私有AsyncTaskCompleteListener回调;
公共加载URL(AsyncTaskCompleteListener cb){
this.callback=cb;
}
受保护的void onPreExecute(){}
受保护的字符串doInBackground(字符串…arg0){
//做点什么
返回内容;
}
受保护的void onPostExecute(字符串内容){
if(回调!=null)
callback.onTaskComplete(内容、编号);
}
}
活动:

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) {...}
}
公共类LoginActivity扩展活动实现AsyncTaskCompleteListener{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
LoadURL LoadURL=新的LoadURL(LoginActivity.this);
loadUrl.execute(…);
}
@凌驾
公共void onTaskComplete(字符串结果,整数){…}
}

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

谢谢您宝贵的时间。我也使用了很多异步任务,但从来没有得到sach类型的问题。
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) {...}
}