目录
前言
因为一些需求原因,作者这几天,去学习了一下安卓开发,因为没有java基础自己便恶补了一些Java的知识(条件,循环,变量的语法形式,不是很多),在编写安卓程序(前端就是java开发的app界面,后端是一个图像分类的模型)时,遇到了一些问题(自从Android3.0之后网络访问不能在主线程中进行),后来查了一下,大部分网友给出的解释是线程问题。
一、为什么不能在主线程中使用网络?
一个APP如果在主线程中请求网络操作,将会抛出此异常。Android这个设计是为了防止网络请求时间过长而导致界面假死的情况发生。
二、解决方法
1.分析问题
首先创建一个新的线程(新的线程主要是用于网络访问,调用服务器上的模型),建立线程的方法(个人觉得挺不错的):
全面详解Android实现多线程的几种方式(史上最全,最详细)_贺兰猪的博客-CSDN博客_android 多线程线程一般是同步进行,主线程是app的运行,而网络线程是模型的访问,但是一般在本地上代码的运行速度要远远大于网络访问的速度,因此不能使他们保持同步。
2.解决步骤
1.首先我创建了一个新的线程,在线程中定义了一个全局变量,方便新的线程与主线程之间变量的用,代码如下(示例):
class MyThread extends Thread {
static String result;
@Override
public void run() {
String result_dict=EasydlImageClassify.easydlImageClassify(pToTActivity.file_path);
result=result_dict
;
}
}
2.然后为了使其同步我在主线程中写了一个while循环,目的就是为了消除两个线程的时间差。首先创建一个指针,使其布尔值为true,然后开始循环,每次循环,都重新接受,网络线程的全局变量,判断它是否为空,当不为空时,改变指针,跳出循环。
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
System.out.println("郝书乐");
//解决在主线程中不能使用网络的问题
// PersonTask task=new PersonTask();
file_path=getSaveFile(getApplicationContext()).getAbsolutePath();
//开启网络线程
MyThread mt=new MyThread();
mt.start();
//首先创建布尔值,默认为ture
boolean temp=true;
//在循环中一直接受网络线程中的全局变量,当变量不为null时,达到同步循环结束。
while (temp){String result_dict=MyThread.result;;if (result_dict==null){temp=true;
}else {temp=false;}};
String result_dict=MyThread.result;
System.out.println(result_dict);
// String result_dict=EasydlImageClassify.easydlImageClassify();
resultText.setText(result_dict);
// Log.d(TAG, result_dict);
}
3.功能实现成功,目前只是把模型返回的结果直接在app的界面显示出来了,并未对其美化,app界面还需要完善。
总结
以上就是今天要和大家分享的内容,可能算是独树一帜吧。哈哈,潦草结尾。