gpt4 book ai didi

android - 如何在主 UI 线程之外编程

转载 作者:太空狗 更新时间:2023-10-29 13:51:35 25 4
gpt4 key购买 nike

我不知道默认情况下是否存在 UI 线程,如果不存在如何创建它,或者如何告诉 我何时“进入”它 如果存在,它从哪里开始和结束。如何确保 PacketListener 不是主 UI 线程的一部分?

我一直遇到此 NetworkOnMainThreadException。我明白这意味着我正在尝试在主 UI 线程中做一些应该有自己的独立线程的事情。但是,我找不到太多可以告诉我如何真正做到这一点的信息。

我原以为 MainActivity 类将成为 UI 线程,因为,嗯,我有一个 UI 并且它可以工作。但是,我已经创建了一个单独的类来实现 Runnable,并将网络连接的东西放在那里,但我仍然收到异常,所以它仍然是主线程的一部分,是吗?我可以看到 MainActivity 没有扩展 Thread,所以这可能是一个愚蠢的假设。如果我添加另一个实现 Runnable/extends Thread 的类,我不觉得任何事情都会改变。会吗?


主 Activity .java

public class MainActivity extends AppCompatActivity {

ArrayList<String> listItems;
ArrayAdapter<String> adapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

listItems = new ArrayList<>();
adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, listItems);
ListView listview = (ListView) findViewById(R.id.listview);
listview.setAdapter(adapter);

(new Thread(new PacketListener(adapter))).run();
}
}

PackageListener.java:

public class PacketListener implements Runnable {
ArrayAdapter<String> adapter;

public PacketListener(ArrayAdapter<String> adapter) {
this.adapter = adapter;
}

public void run() {
byte[] buf = new byte[256];
DatagramPacket packet = new DatagramPacket(buf, buf.length);

try {
DatagramSocket socket = new DatagramSocket();
socket.receive(packet);
}
catch(Exception e) {
adapter.add("Exception: " + e.toString() );
e.printStackTrace();
}
catch(Error e) {
adapter.add("Unspecified Error: " + e.toString() );
e.printStackTrace();
}
}
}

编辑:

我最近的一次尝试,想跟上this page's例如,已经走了我大部分尝试的路线,并完全破坏了应用程序。 SendAnother 是绑定(bind)到按钮的测试方法:

public void sendAnother(View view) {
adapter.add("button clicked");

new Thread(new Runnable() {
public void run() {
listview.post(new Runnable() {
public void run() {
adapter.add("inside worker thread");
}
});
}
});
}

我想接下来我最终会尝试 AsyncTask。我不再关心它是否“脏”。

最佳答案

ui线程是主线程。您通过

了解当前线程
Thread.currentThread().getName();

抱歉,我没有读完你的整个问题,但你必须在除 mainThread 之外的另一个线程中进行阻塞处理。

有很多方法可以做到这一点:AsyncTask、Services、ExecutorService 和 RxJava。选择哪个取决于您的需要

this link会有帮助:)

关于android - 如何在主 UI 线程之外编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46369961/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com