java获取其他线程中的返回值(app开发)

目录

前言

一、为什么不能在主线程中使用网络?

二、解决方法

1.分析问题

2.解决步骤

总结



前言

因为一些需求原因,作者这几天,去学习了一下安卓开发,因为没有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界面还需要完善。

 

 

 


总结

以上就是今天要和大家分享的内容,可能算是独树一帜吧。哈哈,潦草结尾。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在Android开发,你可以使用HTTP请求来与服务器进行通信并获取前端数据。通常情况下,你可以使用Android提供的HttpURLConnection或者第三方库如OkHttp来发送HTTP请求。 以下是一个简单示例,演示如何发送GET请求获取服务器返回的数据: ```java import android.os.AsyncTask; import android.util.Log; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; public class MainActivity extends AppCompatActivity { private static final String TAG = "MainActivity"; private static final String API_URL = "http://example.com/api/data"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 在后台线程执行网络请求 new FetchDataAsyncTask().execute(API_URL); } private class FetchDataAsyncTask extends AsyncTask<String, Void, String> { @Override protected String doInBackground(String... urls) { String result = null; try { URL url = new URL(urls[0]); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); // 发送请求并获取服务器响应 int responseCode = connection.getResponseCode(); if (responseCode == HttpURLConnection.HTTP_OK) { InputStream inputStream = connection.getInputStream(); BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); StringBuilder stringBuilder = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { stringBuilder.append(line); } result = stringBuilder.toString(); } else { Log.e(TAG, "HTTP error code: " + responseCode); } connection.disconnect(); } catch (IOException e) { Log.e(TAG, "Error fetching data: " + e.getMessage()); } return result; } @Override protected void onPostExecute(String result) { if (result != null) { // 在这里解析返回的结果 Log.d(TAG, "Response: " + result); } } } } ``` 在上述示例,我们使用了`AsyncTask`来在后台线程执行网络请求。`doInBackground()`方法执行了GET请求,并将服务器返回的数据读取为字符串。在`onPostExecute()`方法,你可以解析从服务器返回的结果。 请注意,在实际开发,你可能需要根据具体的接口和数据格式来进行相应的解析和处理。此示例仅用于演示基本的HTTP请求和处理服务器返回的数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晨风入晚林

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值