替换AsyncTask实现Android端Socket连接出现报错如何解决?
问题根因
你遇到的两个问题根因分别是:
- 最初的泛型编译错误,是因为
ConnectionTask的executeAsync方法没有声明泛型参数<R>,导致编译器无法识别泛型类型,你直接把泛型硬编码为Socket只是临时绕开了编译问题,不是正确解法 - 点击触发的空指针崩溃,是因为
ClientConnection类中只声明了ConnectionTask taskRunner成员变量,没有在构造函数中初始化该对象,调用taskRunner.executeAsync时自然触发空指针
解决步骤
1. 修复空指针异常
修改ClientConnection的构造方法,初始化taskRunner对象:
public ClientConnection(String ipAddress, String userName, int dstPort) { this.ipAddress = ipAddress; this.userName = userName; this.dstPort = dstPort; // 新增初始化代码 this.taskRunner = new ConnectionTask(); }
2. 正确修复泛型编译问题(无需硬编码为Socket类型)
还原ConnectionTask类的泛型写法,给executeAsync方法加上方法级泛型声明即可:
public class ConnectionTask { private final Executor executor = Executors.newSingleThreadExecutor(); private final Handler handler = new Handler(Looper.getMainLooper()); public interface Callback<R> { void onComplete(R result); } // 方法前加<R>声明泛型 public <R> void executeAsync(Callable<R> callable, Callback<R> callback) { executor.execute(() -> { try { final R result = callable.call(); handler.post(() -> { callback.onComplete(result); }); } catch (Exception e) { e.printStackTrace(); } }); } }
3. 补充必要配置避免后续连接失败
在AndroidManifest.xml中添加网络权限,否则Socket连接会被系统拦截:
<uses-permission android:name="android.permission.INTERNET" />
如果是连接本地局域网服务端,还需要确保手机和服务端在同一个网段,IP、端口填写正确,服务端提前启动并监听对应端口。
内容的提问来源于stack exchange,提问作者Atlas-Pio
相关产品推荐
相关产品推荐

