WiserX 2023-02-16 16:34 采纳率: 100%
浏览 802
已结题

Android Studio :FATAL EXCEPTION: Thread-2

Android Studio :FATAL EXCEPTION: Thread-2

我在编辑设计注册界面的时候,出现的这个问题,如上 ,系统总是报错,但我不知道我写的程序哪里错了,请指点!

我这段代码主要是向网站提交请求,然后注册账号,并保存token在本地。但是每次点击运行都会闪退,并弹出如题所示的报错,查询无果,所以在此询问。


```java
  private void sendRequestWithokhttp() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                OkHttpClient client = new OkHttpClient();
                javaBean.setName(name);
                javaBean.setPassword(password);
                String json = new Gson().toJson(javaBean);
                RequestBody requestBody = RequestBody.create(MediaType.parse("application/json;charset=UTF-8"), json);
                Request request = new Request.Builder()
                        .url("https://**************(保密)")
                        .addHeader("Content-Type", "application/json;charset=UTF-8")
                        .post(requestBody)
                        .build();
                Response response = null;
                try {
                    response = client.newCall(request).execute();
                    if (response.isSuccessful()) {
                        responseData = response.body().string();
                        LoginClass loginClass = new Gson().fromJson(responseData, LoginClass.class);
                        SharedPreferences sp = getSharedPreferences("loginToken", MODE_PRIVATE);
                        SharedPreferences.Editor editor = sp.edit();
                        editor.putString("userName", javaBean.getName());
                        editor.putString("password", javaBean.getPassword());
                        editor.putString("Log_Information", loginClass.getData());
                        editor.apply();
                        Log.e("MainActivity", "+++++++++++" + loginClass.getData());
                        
                        finish();
                    } else {
                   
                    }
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
        }).start();
    }


  • 写回答

1条回答 默认 最新

  • 快撑死的鱼 2023-02-16 18:24
    关注

    回答不易,求求您采纳点赞哦 感激不尽

    根据报错信息 "FATAL EXCEPTION: Thread-2" 可以看出,问题出现在一个名为 "Thread-2" 的线程中,可能是由于网络请求的代码没有正确处理在主线程之外运行的情况导致的。

    Android应用的UI更新必须在主线程上进行,因此在进行网络请求时,如果直接在UI线程中发起请求,可能会导致应用无响应或崩溃。为了避免这种情况,可以使用异步线程来处理网络请求,但是结果需要在主线程上处理。在这种情况下,你可以使用Android提供的Handler或AsyncTask类来处理结果。

    以下是使用Handler处理网络请求结果的示例代码:

    private void sendRequestWithokhttp() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                // 发起网络请求
                OkHttpClient client = new OkHttpClient();
                javaBean.setName(name);
                javaBean.setPassword(password);
                String json = new Gson().toJson(javaBean);
                RequestBody requestBody = RequestBody.create(MediaType.parse("application/json;charset=UTF-8"), json);
                Request request = new Request.Builder()
                        .url("https://**************(保密)")
                        .addHeader("Content-Type", "application/json;charset=UTF-8")
                        .post(requestBody)
                        .build();
                Response response = null;
                try {
                    response = client.newCall(request).execute();
                    if (response.isSuccessful()) {
                        responseData = response.body().string();
                        LoginClass loginClass = new Gson().fromJson(responseData, LoginClass.class);
                        SharedPreferences sp = getSharedPreferences("loginToken", MODE_PRIVATE);
                        SharedPreferences.Editor editor = sp.edit();
                        editor.putString("userName", javaBean.getName());
                        editor.putString("password", javaBean.getPassword());
                        editor.putString("Log_Information", loginClass.getData());
                        editor.apply();
                        Log.e("MainActivity", "+++++++++++" + loginClass.getData());
    
                        // 在主线程上更新UI
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                finish();
                            }
                        });
                    } else {
                        // 请求失败的处理
                    }
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
        }).start();
    }
    
    
    

    在这个示例代码中,我们使用了 runOnUiThread() 方法在主线程上更新UI。

    当然,还有其他的方式来处理这个问题,比如使用AsyncTask等。但是不管哪种方式,关键是要避免在主线程上进行耗时操作,以免导致应用无响应或崩溃。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 7月9日
  • 已采纳回答 7月1日
  • 创建了问题 2月16日

悬赏问题

  • ¥100 两个按钮控制一个LED
  • ¥15 用C语言写离散数学相关问题
  • ¥30 如何用python的GephiStreamer连接到gephi中,把Python和Gephi的具体操作过程都展示,重点回答Gephi软件的调试,以及如果代码的端口在浏览器中无法显示怎么处理
  • ¥15 ansys机翼建模肋参数
  • ¥15 Sumo软件无法运行
  • ¥15 如何在vscode里搭建stata的编辑环境?
  • ¥15 dify知识库创建问题
  • ¥15 如何用C#的chart画1000万个点不卡顿
  • ¥15 爬虫技术找到网上看过房源客户的电话
  • ¥20 代码:Python随机森林反演生物量数据处理问题