Как исправить «Android Fragment» только оригинальному потоку, создавшему иерархию представлений, который может касаться его представлений? - PullRequest
0 голосов
/ 10 мая 2019

У меня проблема с кодом ниже

public class StatusFragment extends Fragment {



    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        final View view = inflater.inflate(R.layout.fragment_status, container, false);

        //Untuk menjalankan command dari API
        {
            getActivity().runOnUiThread(new Runnable() {
                @Override
                public void run() {

                    final TextView tv0 = (TextView) view.findViewById(R.id.textView0);
                    final TextView tv1 = (TextView) view.findViewById(R.id.textView1);
                    final TextView tv2 = (TextView) view.findViewById(R.id.textView2);
                    final TextView tv3 = (TextView) view.findViewById(R.id.textView3);
                    final TextView tv4 = (TextView) view.findViewById(R.id.textView4);
                    final TextView tv5 = (TextView) view.findViewById(R.id.textView5);
                    final TextView tv6 = (TextView) view.findViewById(R.id.textView6);
                    final TextView tv7 = (TextView) view.findViewById(R.id.textView7);
                    final TextView tv8 = (TextView) view.findViewById(R.id.textView8);

                    ApiConnection con = MainActivity.getCon();
                    if (con !=null)
                        try {

                            //Untuk Menampilkan Resource dari Mikrotik
                            String rs = con.execute("/system/resource/print interval=3",
                                    new ResultListener() {

                                        public void receive(Map<String, String> result) {
                                            tv0.setText(result.get("platform"));
                                            tv1.setText(result.get("board-name"));
                                            tv2.setText(result.get("version"));
                                            tv3.setText(result.get("uptime"));
                                            tv4.setText(String.format("%s %%", result.get("cpu-load")));
                                            tv5.setText(String.format("%s MB", Integer.parseInt(result.get("free-memory")) / (1024*1024)));
                                            tv6.setText(String.format("%s MB", Integer.parseInt(result.get("total-memory")) / (1024*1024)));
                                            tv7.setText(String.format("%s MB", Integer.parseInt(result.get("free-hdd-space")) / (1024*1024)));
                                            tv8.setText(String.format("%s MB", Integer.parseInt(result.get("total-hdd-space")) / (1024*1024)));
                                        }

                                        public void error(MikrotikApiException e) {
                                            System.out.println("An error occurred: " + e.getMessage());
                                        }

                                        public void completed() {
                                            System.out.println("Asynchronous command has finished");
                                        }
                                    }

                            );


                        } catch (MikrotikApiException e) {
                            e.printStackTrace();
                        }
                }
            });


        }

        return view;
    }

}

--------- начало аварии

05-10 08: 26: 58.797 7122-7164 / com.tasanahetech.mikroboxv2 E / AndroidRuntime: ФАТАЛЬНОЕ ИСКЛЮЧЕНИЕ: Mikrotik API Result Processor Процесс: com.tasanahetech.mikroboxv2, PID: 7122 android.view.ViewRootImpl $ CalledFromWrongThreadException: только исходный поток, создавший иерархию представлений, может касаться его представлений. на android.view.ViewRootImpl.checkThread (ViewRootImpl.java:6556) на android.view.ViewRootImpl.requestLayout (ViewRootImpl.java:907) на android.view.View.requestLayout (View.java:18722) на android.view.View.requestLayout (View.java:18722) на android.view.View.requestLayout (View.java:18722) на android.view.View.requestLayout (View.java:18722) на android.view.View.requestLayout (View.java:18722) на android.view.View.requestLayout (View.java:18722) на android.widget.RelativeLayout.requestLayout (RelativeLayout.java:360) на android.view.View.requestLayout (View.java:18722) на android.view.View.requestLayout (View.java:18722) на android.support.constraint.ConstraintLayout.requestLayout (ConstraintLayout.java:3172) на android.view.View.requestLayout (View.java:18722) на android.view.View.requestLayout (View.java:18722) на android.view.View.requestLayout (View.java:18722) на android.widget.TextView.checkForRelayout (TextView.java:7172) на android.widget.TextView.setText (TextView.java:4342) на android.widget.TextView.setText (TextView.java:4199) на android.widget.TextView.setText (TextView.java:4174) на com.tasanahetech.mikroboxv2.StatusFragment $ 1 $ 1.receive (StatusFragment.java:57) at com.tasanahetech.mikroboxv2.api.impl.ApiConnectionImpl $ Processor.run (ApiConnectionImpl.java:258)

Спасибо

1 Ответ

0 голосов
/ 10 мая 2019

Самый быстрый способ решить эту проблему - обернуть все вызовы tv0.setText () внутри функции receive () в другой блок runOnUiThread.Вот так:

public void receive(Map<String, String> result) {
  getActivity().runOnUiThread(new Runnable() {
    @Override
    public void run() {
      tv0.setText(result.get("platform"));
      tv1.setText(result.get("board-name"));
      tv2.setText(result.get("version"));
      tv3.setText(result.get("uptime"));
      tv4.setText(String.format("%s %%", result.get("cpu-load")));
      tv5.setText(String.format("%s MB", Integer.parseInt(result.get("free-memory")) / (1024*1024)));
      tv6.setText(String.format("%s MB", Integer.parseInt(result.get("total-memory")) / (1024*1024)));
      tv7.setText(String.format("%s MB", Integer.parseInt(result.get("free-hdd-space")) / (1024*1024)));
      tv8.setText(String.format("%s MB", Integer.parseInt(result.get("total-hdd-space")) / (1024*1024)));
  });
}

и ауттер "getActivity (). RunOnUiThread" можно удалить.

...