我的下面的代码有问题
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结果处理器进程: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.View.requestLayout(View.java:18722) .java:18722),位于android.view.View.requestLayout(View.java:18722),位于android.widget.RelativeLayout.requestLayout(RelativeLayout.java:360),位于android.view.View.requestLayout(View。
谢谢
解决问题的最快方法是,将receive()函数中的所有“ tv0.setText()”调用包装到另一个“ 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”。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句