[英]Accessing UI Thread or Main Thread from External class implementing Runnable
我讨厌The application may be doing too much work on its main thread, skipped XXX frames
.. 警告,同时它降低了用户的 UI 交互体验。 所以用适当的方式尝试它,因为android希望它成为......
主要活动 :
public class MainActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener
{
public Button StartBg;
private static final String TAG = "TASK_FIRST";
private Handler mainHandler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
StartBg = findViewById(R.id.StartBg);
StartBg.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View view)
{
ExampleRunner ExampleRunnerObj = new ExampleRunner(50000);
new Thread(ExampleRunnerObj).start();
}
});
}
}
当我将下面的类作为MainActivity
内部类时,它可以访问 UI 组件。
示例跑步者:
public class ExampleRunner implements Runnable
{
int count;
public ExampleRunner(int count)
{
this.count = count;
}
@Override
public void run()
{
Handler threadHandler = new Handler(Looper.getMainLooper());
for(int i = 0; i < count; i++)
{
Log.d(TAG,"PERFORMING : "+i+"\n");
if(i == 25000)
{
threadHandler.post(new Runnable()
{
@Override
public void run()
{
// StartBg.setText("50k");
// OR RETURN SOMETHING..
}
});
}
}
}
}
但是当我将ExampleRunner
作为单独的外部类时,它说StartBg
无法解析......
那么,我应该如何:
提前致谢。
您需要将外部类Button
作为参考传递:
public class ExampleRunner implements Runnable
{
int count;
Button startBg;
public ExampleRunner(int count, Button startBg) {
this.count = count;
this.startBg = startBg;
}
并用它创建它:
ExampleRunner ExampleRunnerObj = new ExampleRunner(50000, StartBg);
然后它将能够在run()
使用它。
现在, ExampleRunner
是一个匿名类,访问本地声明的StargBg
变量。
如果,我正确理解您,对于您的解决方案, AsyncTask
是一个很好的解决方案。
检查文档https://developer.android.com/reference/android/os/AsyncTask
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.