繁体   English   中英

从实现 Runnable 的外部类访问 UI 线程或主线程

[英]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无法解析......

那么,我应该如何:

  1. 制作实现 Runnable 的外部 java 类,访问主线程 UI 组件......?
  2. 或者至少将一些东西返回给我启动它的 mainActivity,这样我就可以从 mainActivity 访问它?

提前致谢。

您需要将外部类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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM