【问题标题】:Skipped 148 frames! The application may be doing too much work on its main thread, android?跳过了 148 帧!应用程序可能在其主线程 android 上做了太多工作?
【发布时间】:2016-07-04 13:32:02
【问题描述】:

我正在以编程方式创建大量 edittext 和 texviews,并将它们放在 tablelayout 中。 这是我的代码

private EditText[] etAgreedVolume, etAgreedSaleParty, etAgreedSalesMgr;

private void createOrderTable(ArrayList<POJOOrder> orderList) {
    etAgreedVolume = new EditText[orderList.size()];
    etAgreedSaleParty = new EditText[orderList.size()];
    etAgreedSalesMgr = new EditText[orderList.size()];
    int maxLength = 3;
    InputFilter[] FilterArray = new InputFilter[1];
    FilterArray[0] = new InputFilter.LengthFilter(maxLength);

    for (int i = 0; i < orderList.size(); i++) {
        TableRow tableRow = new TableRow(getActivity());
        tableRow.setLayoutParams(new TableLayout.LayoutParams(TableLayout.LayoutParams.WRAP_CONTENT, TableLayout.LayoutParams.WRAP_CONTENT));

        TextView tvItem = new TextView(getActivity());
        tvItem.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.MATCH_PARENT));
        tvItem.setText(orderList.get(i).getBrandWith_SKU());
        tvItem.setTextColor(Color.parseColor("#2E3B41"));
        tvItem.setGravity(Gravity.CENTER);
        tvItem.setPadding(10, 10, 10, 10);
        tvItem.setBackgroundResource(R.drawable.rectangle_grey);

        TextView tvPlannedVolume = new TextView(getActivity());
        tvPlannedVolume.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.MATCH_PARENT));
        tvPlannedVolume.setText(orderList.get(i).getPlannedVolume() + " CS");
        tvPlannedVolume.setTextColor(Color.parseColor("#2E3B41"));
        tvPlannedVolume.setGravity(Gravity.CENTER);
        tvPlannedVolume.setPadding(10, 10, 10, 10);
        tvPlannedVolume.setBackgroundResource(R.drawable.rectangle_grey);

        LinearLayout linearLayout1 = new LinearLayout(getActivity());
        linearLayout1.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.MATCH_PARENT, TableRow.LayoutParams.MATCH_PARENT));
        linearLayout1.setOrientation(LinearLayout.HORIZONTAL);

        TextView tvPlannedSalesParty = new TextView(getActivity());
        tvPlannedSalesParty.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.MATCH_PARENT, 1f));
        tvPlannedSalesParty.setText(orderList.get(i).getPlannedSalesPromoParty() + "");
        tvPlannedSalesParty.setTextColor(Color.parseColor("#2E3B41"));
        tvPlannedSalesParty.setGravity(Gravity.CENTER);
        tvPlannedSalesParty.setPadding(10, 10, 10, 10);
        tvPlannedSalesParty.setBackgroundResource(R.drawable.rectangle_grey);

        TextView tvPlannedSalesMgr = new TextView(getActivity());
        tvPlannedSalesMgr.setLayoutParams(new TableRow.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.MATCH_PARENT, 1f));
        tvPlannedSalesMgr.setText(orderList.get(i).getPlannedSalesPromoMgr() + "");
        tvPlannedSalesMgr.setTextColor(Color.parseColor("#2E3B41"));
        tvPlannedSalesMgr.setGravity(Gravity.CENTER);
        tvPlannedSalesMgr.setPadding(10, 10, 10, 10);
        tvPlannedSalesMgr.setBackgroundResource(R.drawable.rectangle_grey);

        linearLayout1.addView(tvPlannedSalesParty);
        linearLayout1.addView(tvPlannedSalesMgr);

        etAgreedVolume[i] = new EditText(getActivity());
        etAgreedVolume[i].setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.MATCH_PARENT));
        etAgreedVolume[i].setTextColor(ContextCompat.getColor(getActivity(), android.R.color.black));
        etAgreedVolume[i].setGravity(Gravity.CENTER);
        etAgreedVolume[i].setHintTextColor(Color.parseColor("#888888"));
        etAgreedVolume[i].setHint("0");
        etAgreedVolume[i].setPadding(10, 10, 10, 10);
        etAgreedVolume[i].setBackgroundResource(R.drawable.rectangle_grey);
        etAgreedVolume[i].setInputType(InputType.TYPE_CLASS_NUMBER);
        etAgreedVolume[i].addTextChangedListener(watcherAgreedVolume);
        etAgreedVolume[i].setFilters(FilterArray);

        LinearLayout linearLayout2 = new LinearLayout(getActivity());
        linearLayout2.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.MATCH_PARENT, TableRow.LayoutParams.MATCH_PARENT));
        linearLayout2.setOrientation(LinearLayout.HORIZONTAL);

        etAgreedSaleParty[i] = new EditText(getActivity());
        etAgreedSaleParty[i].setLayoutParams(new TableRow.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.MATCH_PARENT, 1f));
        etAgreedSaleParty[i].setTextColor(ContextCompat.getColor(getActivity(), android.R.color.black));
        etAgreedSaleParty[i].setGravity(Gravity.CENTER);
        etAgreedSaleParty[i].setHintTextColor(Color.parseColor("#888888"));
        etAgreedSaleParty[i].setHint("0");
        etAgreedSaleParty[i].setPadding(10, 10, 10, 10);
        etAgreedSaleParty[i].setBackgroundResource(R.drawable.rectangle_grey);
        etAgreedSaleParty[i].setInputType(InputType.TYPE_CLASS_NUMBER);
        etAgreedSaleParty[i].addTextChangedListener(watcherAgreedVolume);
        etAgreedSaleParty[i].setFilters(FilterArray);

        etAgreedSalesMgr[i] = new EditText(getActivity());
        etAgreedSalesMgr[i].setLayoutParams(new TableRow.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.MATCH_PARENT, 1f));
        etAgreedSalesMgr[i].setTextColor(ContextCompat.getColor(getActivity(), android.R.color.black));
        etAgreedSalesMgr[i].setGravity(Gravity.CENTER);
        etAgreedSalesMgr[i].setPadding(10, 10, 10, 10);
        etAgreedSalesMgr[i].setHintTextColor(Color.parseColor("#888888"));
        etAgreedSalesMgr[i].setHint("0");
        etAgreedSalesMgr[i].setBackgroundResource(R.drawable.rectangle_grey);
        etAgreedSalesMgr[i].setInputType(InputType.TYPE_CLASS_NUMBER);
        etAgreedSalesMgr[i].addTextChangedListener(watcherAgreedVolume);
        etAgreedSalesMgr[i].setFilters(FilterArray);

        linearLayout2.addView(etAgreedSaleParty[i]);
        linearLayout2.addView(etAgreedSalesMgr[i]);

        tableRow.addView(tvItem);
        tableRow.addView(tvPlannedVolume);
        tableRow.addView(linearLayout1);
        tableRow.addView(etAgreedVolume[i]);
        tableRow.addView(linearLayout2);

        tableLayout.addView(tableRow);
    }
}

我的应用程序的这个页面变得太慢了。有时甚至会由于繁重的工作而发生 ANR。 我怎样才能使它顺利。

【问题讨论】:

  • 听起来你应该使用 RecyclerView 而不是 TableView。 RecyclerView 只会创建实际显示在屏幕上的视图,并在滚动浏览它时回收它们。你避免了你看到的大量工作
  • 考虑使用 RxJava 创建所有视图或使用 RecyclerView。

标签: android android-layout android-view


【解决方案1】:

选项 1

创建一个AsyncTask并在那里进行所有处理,最后在AsyncTaskonPostExecute中设置布局元素。此外,您可能希望在执行AsyncTask 期间显示ProgressBar,并在onPostExecute 中将其关闭。

向下滚动到AsyncTask documentation 中的副标题“The 4 steps”,以更好地了解此解决方案。

选项 2

创建一个包含 TableRow 及其所有子项的 XML 文件(例如 myTableRow.xml),设置所有公共参数,即不依赖于 iterator integer i 的参数。所以基本上你正在创建一个所有人都通用的TableRow 模板。

然后在for Loop 中你剩下要做的就是:为每次迭代膨胀myTableRow.xml,设置剩余参数(依赖于i),最后将其添加到tableLayout

注意:尽管它们依赖于i,但应该可以将您的EditText 视图etAgreedVolume[i]etAgreedSaleParty[i]etAgreedSalesMgr[i] 添加到XML 文件(即您的TableRow 模板)中。我建议您通过简单地创建(标准)EditText 视图来做到这一点,然后一旦您膨胀了 TableRow,您就可以检索这些 EditTexts 并将它们添加到数组中。

我不能保证“选项 2”会运行得更快或更流畅,但是,在大多数情况下,膨胀布局比使用硬编码 java 创建布局更快。

【讨论】:

    【解决方案2】:

    必须使用 listView 来创建视图。 Tablelayout 无法容纳这么大的数据。

    【讨论】:

      【解决方案3】:

      更新您对单独 Uithread 的看法 示例:

      private void runThread() {
      
      new Thread() {
          public void run() {
              while (/*your condition*/) {
                  try {
                      runOnUiThread(new Runnable() {
      
                          @Override
                          public void run() {
                              //update your views here
                          }
                      });
      
                  } catch (InterruptedException e) {
                      e.printStackTrace();
                  }
              }
          }
      }.start();
      }
      

      如果你更新你的视图,在你的情况下,主线程会做很多工作,导致跳帧和 ANR

      【讨论】:

        猜你喜欢
        • 2021-01-02
        • 2013-06-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-31
        相关资源
        最近更新 更多