所以基本上我只是很快就会告诉你app-flow,
一个异步任务(a)从url获取源代码并将其传递给另一个异步任务(b),其中有几个需要完成的阵列副本和拆分,总共约500行代码,但是我说,很多if / for / split / arraycopy方法..之后它重新启动了viewpager并刷新了数据..
所以当数据被提取和排序时,UI应该显示某种加载提示,它会做什么,但是大约一秒后它完全滞后,整个UI线程被阻止,尽管所有工作都已完成在doInBackground方法中..我认为doInBackground方法应该处理“重负荷”..
是否存在某种限制,或者我错过了什么......
我将发布我正在使用的粗略异步任务..
public class ProcessingService extends Service {
Method1();
Method2();
Method3();
//etc.. about 10 methods with ~500 lines of code..
@Override
public int onStartCommand(Intent iservice1, int flags, int startId) {
processingit();
return Service.START_NOT_STICKY;
}
public void processingit() {
new ProcessingOutsourced().execute();
}
public class ProcessingOutsourced extends AsyncTask<String, Void, Void> {
public void onPreExecute() {
}
public Void doInBackground(String... urls) {
Method1();
Method2();
Method3();
//Etc..
return null;
}
public void onPostExecute(Void unused) {
Context b = getBaseContext();
processing goon2 = new processing(b); //Passed onto another class to finish in entirely..
goon2.finishLoading();
stopSelf();
}
}
@Override
public IBinder onBind(Intent intent) {
//for communication return IBinder implementation
return null;
}
}
所以基本上..我相信我在doInBackground部分做错了什么..或者我不允许把它传递到另一个类?我本来希望在异步中做所有事情,但我无法在其中使用“viewpager.notifydatasetchanged”..这就是为什么我需要传递它。
赞赏任何类型的提示..!
编辑:
所以基本上我是一个非常懒惰的人并且使用了使用占位符片段的viewpager片段,并且我使用了几个if方法来找出哪个页面正好被显示,因此每次条件改变时都会膨胀一个新视图。
if (getArguments().getInt(ARG_SECTION_NUMBER) == 0) {
if (ClassC.rdy == 0 && ClassC.PullFailedAndRefresh == 0) {
View rootView11 = inflater.inflate(R.layout.mat_while_loading_in_main, container, false);
TextView textAbove = (TextView)rootView11.findViewById(R.id.whileloadingAbove);
textAbove.setText("Vertretung Heute wird geladen...");
return rootView11;
}else if (ClassC.rdy == 0 && ClassC.PullFailedAndRefresh == 1) {
View rootView1111 = inflater.inflate(R.layout.mat_loading_aborted_refresh, container, false);
return rootView1111;
} else if (ClassC.rdy == 1 && ClassC.abwh.equalsIgnoreCase("Abw") && ClassC.datumh.equalsIgnoreCase("Vertretung Datum eintragen")) {
View rootView11111 = inflater.inflate(R.layout.mat_keine_vertretung_eingerichtet, container, false);
return rootView11111;
} else if (ClassC.rdy == 1 && !ClassC.frageTimeout) {
View rootView111 = inflater.inflate(R.layout.mat_loading_aborted, container, false);
return rootView111;
} else if (ClassC.rdy == 1 && ClassC.pullWorked == 1) {
View rootView2 = inflater.inflate(R.layout.mat_vertretungsplan, container, false);
TextView textView1 = (TextView) rootView2.findViewById(R.id.section_label);
TextView textView121 = (TextView) rootView2.findViewById(R.id.spalte_1); //SPALTE1
TextView textView221 = (TextView) rootView2.findViewById(R.id.spalte_2); //SPALTE2
TextView textView321 = (TextView) rootView2.findViewById(R.id.spalte_3); //SPALTE3
TextView textView421 = (TextView) rootView2.findViewById(R.id.spalte_4); //SPALTE4
TextView textView521 = (TextView) rootView2.findViewById(R.id.spalte_5); //SPALTE5
TextView textView621 = (TextView) rootView2.findViewById(R.id.spalte_6); //SPALTE6
TextView textView721 = (TextView) rootView2.findViewById(R.id.spalte_7); //SPALTE7
TextView wat1 = (TextView) rootView2.findViewById(R.id.BonusHinweise);
TextView textView31 = (TextView) rootView2.findViewById(R.id.Abwesendenliste);
TextView textView41 = (TextView) rootView2.findViewById(R.id.GeneralHinweis);
textView1.setTextSize(dgrose);
textView1.setText(ClassC.datumh); //DATUM-H
textView121.setTextSize(vpgrose);
textView121.setText(Html.fromHtml(ClassC.dieausgabeh1)); //SPALTE1_H
textView221.setTextSize(vpgrose);
textView221.setText(Html.fromHtml(ClassC.dieausgabeh2)); //SPALTE2_H
textView321.setTextSize(vpgrose);
textView321.setText(Html.fromHtml(ClassC.dieausgabeh3)); //SPALTE3_H
textView421.setTextSize(vpgrose);
textView421.setText(Html.fromHtml(ClassC.dieausgabeh4)); //SPALTE4_H
textView521.setTextSize(vpgrose);
textView521.setText(Html.fromHtml(ClassC.dieausgabeh5)); //SPALTE5_H
textView621.setTextSize(vpgrose);
textView621.setText(Html.fromHtml(ClassC.dieausgabeh6)); //SPALTE6_H
textView721.setTextSize(vpgrose);
textView721.setText(Html.fromHtml(ClassC.dieausgabeh7)); //SPALTE7_H
textView31.setTextSize(agrose);
textView31.setText(/*"\n" + */ClassC.abwh);
textView41.setTextSize(hgrose);
textView41.setText(R.string.atung);
if (ClassC.watchh != 0) {
wat1.setTextSize(hgrose);
wat1.setText("");
} else if (ClassC.abwfuckedup != 0) {
wat1.setTextSize(hgrose);
wat1.setText("");
} else if (ClassC.watchh != 0 && ClassC.abwfuckedup != 0) {
wat1.setTextSize(hgrose);
wat1.setText("");
} else {
wat1.setTextSize(hgrose);
wat1.setText("Kein Hinweis");
}
return rootView2;
}
这只是具有4种不同状态的页面之一,看起来这样太过分了。我应该为每个页面创建一个单独的类吗?有什么可以帮助除了阅读Android文档..:l?
答案 0 :(得分:2)
public void onPostExecute(Void unused) {
Context b = getBaseContext();
processing goon2 = new processing(b); //Passed onto another class to finish in entirely..
goon2.finishLoading();
stopSelf();
}
这个代码在UI线程上运行 - 只有doInBackground()在一个单独的线程上运行,onPostExecute()没有,因为它预计你会用它来使用您的任务已获取/生成的新数据更新您的界面。
因此,您在此处运行的任何冗长操作都将阻止UI线程,这会导致您看到的效果。