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