Android,异步任务的doInBackground期间的巨型滞后(实际上:在膨胀视图时)

时间:2015-01-20 21:49:46

标签: android asynchronous

所以基本上我只是很快就会告诉你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?

1 个答案:

答案 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线程,这会导致您看到的效果。