1.前言
最近和实验室的朋友一起做了一个项目,我主要负责安卓应用开发。开发中遇到了许多新手常见问题,下面就是这些问题和解决方案。
2.正文
- App的主要功能是通过和服务器交互,获取服务器端的json文件,然后通过安卓UI组件动态显示出来。点击对应的按钮则向服务器发出对应请求。
- 做App时主要遇到了两个错误。第一就是直接在主线程中发送网络请求;第二就是在其他线程中修改UI组件。这两个错误其实是安卓开发的常识性错误:不能在主线程中访问网络;不能在其他线程中获取和修改UI组件。
- 具体错误及解决方法
- 不能在主线程中访问网络:新开一个线程来访问网络。
- Only the original thread that created a view hierarchy can touch its views(只有原来创建UI组件的线程才能访问这个UI组件):参考这篇文章戳这里。下面是我参考这篇文章后的主要代码片段。
//新建一个Hander
private final Handler mHandler = new Handler();
//更新UI组件的runnable接口
final Runnable mUpdateResults = new Runnable() {
public void run() {
updateUI();
}
};
//更新UI组件的具体操作
private void updateUI() {
tv_light_value.setText(light_value);
tv_nutrition_value.setText(nutrition_value);
tv_water_value.setText(water_value);
}
//这个类中把要做的事情做完了之后 调用hander的post方法来更新UI
class jsonThread implements Runnable {
private String url;
public jsonThread(String url) {
this.url = url + "/guang.json";
}
@Override
public void run() {
while(true) {
String result = HttpUtil.getHttpResult(url);
if(result == null) {
Looper.prepare();
ToastUtil.showToast(MainActivity.this, "网络连接错误");
Looper.loop();
} else {
try {
JSONArray array = new JSONArray(result);
light_value = array.getJSONObject(0).getString("guang");
water_value = array.getJSONObject(0).getString("shidu");
nutrition_value = array.getJSONObject(0).getString("wendu");
jiaoshui = array.getJSONObject(0).getString("jiaoshui");
yingyang = array.getJSONObject(0).getString("shifei");
buguang = array.getJSONObject(0).getString("buguang");
//上面已经把要处理的东西处理完了,接下来调用post方法来更新UI
mHandler.post(mUpdateResults);
} catch (JSONException e) {
e.printStackTrace();
}
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
- 还有一些其他错误如用wamp一键搭建web服务器时发现同一局域网下手机访问网站403了。解决方法如下:把箭头所指的文件的里面的Require local改成Require all granted,然后重启服务器手机就可以访问了。
3.总结
- 务必学好Java再碰安卓(当然现在开发安卓也可以用Kotlin)。
- 比赛一定要找适合的队友组队(
别随缘找队友了),不然真心觉得憨上加憨。
好好学习,天天向上。