如何解决在Android的主线程上运行意味着什么
我正在尝试通过android应用(客户端)通过TCP连接到PC服务器(使用Hercules),但我真的迷路了,不知道要去哪里。没有一个教程对我来说完全有效,大多数教程都可以使我从客户端向服务器发送消息,反之亦然。
我读到一些不应该从“主线程”运行的连接,但这意味着什么?
任何来自android的TCP连接示例都很棒。
谢谢!
解决方法
我怀疑在此上下文中的“主线程”是指正在管理用户界面的线程。如果您在此线程中执行任何操作,则可能会导致Android死机,因为它似乎已挂起。
就个人而言,我认为拥有用户界面线程块数毫秒来执行TCP操作并不是一个大问题。您需要确保对操作进行编码以使其具有合理的超时时间,以免因为远程服务器响应时间太长而导致应用程序死机。
处理此类情况的官方方法是在服务或单独的线程中定义网络操作,并让用户界面线程使用短暂的操作与那些服务或线程进行通信。
此过程在此处有示例记录:
https://developer.android.com/training/basics/network-ops/connecting
,android中的主线程负责在屏幕上创建和显示UI
要严格执行与连接有关的任务,需要使用后台线程,否则UI会变得迟钝。
有两种方法可以执行后台任务
-
可运行:
new Thread(new Runnable() { public void run() { ..... // code here } }).start();
-
Android AsyncTask:https://developer.android.com/reference/android/os/AsyncTask
就像@Kevin Boone所说的,“主线程”表示Android中的UI线程。
您无法在Main线程中进行联网操作,否则将得到 NetworkOnMainThreadException 。您可以创建一个新线程,然后使用Handler将结果传递回主线程。代码可能看起来像这样:
public class MyActivity extends AppCompatActivity implements FetchDataUseCase.Listener {
private FetchDataUseCase fetchDataUseCase;
private TextView textView;
private Button dataButton;
public void onCreate() {
textView = findViewById(R.id.textView);
dataButton = findViewById(R.id.dataButton);
dataButton.setOnClickListener(v -> getDataFromNetwork());
fetchDataUseCase = new FetchDataUseCase(this);
}
void getDataFromNetwork() {
fetchDataUseCase.fetchDataAndNotify();
// start async operation! and receive result in onDataFetched()
}
@Override
public void onDataFetched(String data) {
// now you are in Main thread
// do something with data
textView.setText(data);
textView.setVisibility(View.VISIBLE);
}
@Override
public void onError() {
textView.setText("ERROR!!!");
textView.setVisibility(View.VISIBLE);
}
}
public class FetchDataUseCase {
public interface Listener {
void onDataFetched(String data);
void onError();
}
private final Listener listener;
private final Handler handler = new Handler(Looper.getMainLooper());
public FetchDataUseCase(Listener listener) {
this.listener = listener;
}
public void fetchDataAndNotify() {
new Thread(() -> {
String myData = "";
try {
// your networking operation
// where you receive some data
} catch (Exception e) {
handler.post(() -> listener.onError();
} finally {
// close stream,file,...
}
// pass it back to Listener in Ui Thread
handler.post(() -> listener.onDataFetched(myData);
}).start();
}
}
阅读ThreadPoster: Multi-Threading in Android
不要使用AsyncTask =))Async task is deprecated
此外,您还需要在AndroidManifest文件中添加permision。
<uses-permission android:name="android.permission.INTERNET"/>
希望它将对您有帮助))祝您好运!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。