尝试发送 Android 图像时应用程序崩溃

2023-12-09

我在尝试将图像从我的应用程序发送到服务器时遇到问题。我知道它在哪里崩溃。 这些是我的文件:

RestClient.java

package edu.gvsu.cis.masl.camerademo;

import android.util.Log;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpEntityEnclosingRequestBase;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import org.apache.http.util.EntityUtils;
import java.io.IOException;
import java.io.UnsupportedEncodingException;


public class RestClient {

private static final int DEFAULT_CONNECTION_TIMEOUT = 30000;
private static final int DEFAULT_RECEIVE_TIMEOUT = 60000;
//private static final String AUTHORIZATION = "Authorization";
private static final String CONTENT_TYPE = "Content-Type";
private static final String JSON_CONTENT_TYPE = "application/json; charset=utf-8";
private static final String UTF8 = "UTF8";
private static final String DEBUG = RestClient.class.getName();


public Result put(String url, String json) {
    return executeRequest(new HttpPut(url), json, DEFAULT_RECEIVE_TIMEOUT);
}



private Result executeRequest(HttpEntityEnclosingRequestBase request, String json, int timeout) {
    request.addHeader(CONTENT_TYPE, JSON_CONTENT_TYPE);
    try {
        request.setEntity(new StringEntity(json,UTF8));
    }catch(UnsupportedEncodingException e) {
        Log.e(DEBUG, e.getMessage());
        return Result.error();
    }
    return executeRequest(request,timeout);
}


private Result executeRequest(HttpUriRequest request, int timeout) {

    int responseCode = -1;
    String responseContent = null;
    //request.addHeader(AUTHORIZATION, encodeCredentials(userCredentials));
    HttpParams httpParams = new BasicHttpParams();
    HttpConnectionParams.setConnectionTimeout(httpParams, DEFAULT_CONNECTION_TIMEOUT);
    HttpConnectionParams.setSoTimeout(httpParams, timeout);
    HttpClient client = new DefaultHttpClient(httpParams);

    try {
        HttpResponse response = client.execute(request);
        HttpEntity entity = response.getEntity();
        responseCode = response.getStatusLine().getStatusCode();
        if(entity!=null) {
            responseContent = EntityUtils.toString(entity, UTF8);
        }

    }catch(IOException e) {
        Log.e(DEBUG, e.getMessage());
        return Result.error();
    }
    return new Result(responseCode, responseContent);
}


}

ImageDTO.java:

public class ImageDTO {

public String id;
public String image;

public ImageDTO(String id, String image) {
    this.id = id;
    this.image=image;
}

}

结果.java:

package edu.gvsu.cis.masl.camerademo;

public class Result {

public static final int COMMUNICATION_ERROR = -1;
public static final int OK_SUCCESS = 200;
public static final int BAD_REQUEST = 400;
public static final int UNAUTHORIZED = 401;
public static final int NOT_FOUND = 404;
public static final int INTERNAL_SERVER_ERROR = 500;

private int responseCode;
private String resultContent;

public Result(int responseCode, String resultContent) {
    this.responseCode = responseCode;
    this.resultContent = resultContent;
}

public int getResponseCode() {
    return this.responseCode;
}

public String getResultContent() {
    return this.resultContent;
}

public static Result error() {
    return new Result(COMMUNICATION_ERROR, "ERROR");
}

}

我的活动中的代码与此相关:

String strBase64 = Base64.encodeToString(imageBytes, Base64.DEFAULT);
            int id = 1;

            ImageDTO imdto = new ImageDTO(Integer.toString(id), strBase64);

            RestClient client = new RestClient();
            String jsonDTO = new Gson().toJson(imdto);

            Log.i("Pablo", jsonDTO);
            Result result = client.put(SERVICE_URL, jsonDTO);
            if (result.getResponseCode() != 200) Log.i("****************", "Oups! Smth went wrong!!!");
            else Log.i("****************", "Response = 200 , Connection Established :D");

我的应用程序在 RestClient.java 中失败:

HttpResponse response = client.execute(request);

我不知道为什么它失败,因为 RestClient 和结果文件在其他项目中工作正常。

另外我不得不说 Base64 代码在 IntelliJ Idea 中显示不完整。如果我询问最新的字符,它是正确的,但它无法以日志模式显示所有字符。

这是显示失败的日志:

ERROR/AndroidRuntime(27028): FATAL EXCEPTION: main
    Process: edu.gvsu.cis.masl.camerademo, PID: 27028
    java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=1888, result=-1, data=null} to activity {edu.gvsu.cis.masl.camerademo/edu.gvsu.cis.masl.camerademo.MyCameraActivity}: android.os.NetworkOnMainThreadException
    at android.app.ActivityThread.deliverResults(ActivityThread.java:3365)
    at android.app.ActivityThread.handleSendResult(ActivityThread.java:3408)
    at android.app.ActivityThread.access$1300(ActivityThread.java:135)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1244)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:136)
    at android.app.ActivityThread.main(ActivityThread.java:5017)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:515)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
    at dalvik.system.NativeStart.main(Native Method)
    Caused by: android.os.NetworkOnMainThreadException
    at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1145)
    at java.net.InetAddress.lookupHostByName(InetAddress.java:385)
    at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236)
    at java.net.InetAddress.getAllByName(InetAddress.java:214)
    at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137)
    at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
    at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465)
    at edu.gvsu.cis.masl.camerademo.RestClient.executeRequest(RestClient.java:61)
    at edu.gvsu.cis.masl.camerademo.RestClient.executeRequest(RestClient.java:46)
    at edu.gvsu.cis.masl.camerademo.RestClient.put(RestClient.java:33)
    at edu.gvsu.cis.masl.camerademo.MyCameraActivity.onActivityResult(MyCameraActivity.java:78)
    at android.app.Activity.dispatchActivityResult(Activity.java:5423)
    at android.app.ActivityThread.deliverResults(ActivityThread.java:3361)
    ... 11 more

引起原因:android.os.NetworkOnMainThreadException

Reason :当应用程序尝试在其主线程上执行网络操作时引发的异常。

仅针对 Honeycomb SDK 或更高版本的应用程序才会抛出此错误。允许针对早期 SDK 版本的应用程序在其主事件循环线程上进行联网,但强烈建议不要这么做。

Refer 网络主线程异常了解更多信息。

问题 :您正在执行与网络相关的任务/操作Main thread (UI thread).

解决方案:它应该在一个worker thread。 您可以使用AsyncTask在这种情况下由android提供。 执行所有与网络相关的任务doInbackground的方法AsyncTask.

Note :您还可以利用StrictMode.

StrictMode是一个开发人员工具,它可以检测您可能意外执行的操作并引起您的注意,以便您可以修复它们。

StrictMode最常用于捕获应用程序主线程上的意外磁盘或网络访问,在该主线程中接收 UI 操作并发生动画。将磁盘和网络操作保持在主线程之外可以使应用程序更加流畅、响应更快。通过保持应用程序的主线程响应,您还可以防止ANR dialogs从向用户展示。

Refer 严格模式了解更多信息。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

尝试发送 Android 图像时应用程序崩溃 的相关文章

随机推荐

  • THE 7 不尊重java安全随机种子

    我手头有一个难题 我创建了一个 AES 服务来加密 解密敏感信息 AES 密钥是使用 java 随机生成的SecureRandom 我有一个受保护的文件 用于存储种子 并且在调用服务时 种子将填充到安全随机类中 为了确保它有效 我有以下逻辑
  • 改变 PopupWindow 的重力

    我有一个必须显示弹出窗口的按钮 并且弹出窗口必须与按钮的右侧对齐 我就是这么做的 button setOnClickListener new View OnClickListener Override public void onClick
  • 如何在z3py中连接正则表达式?

    我想构造一个正则表达式 例如a b c z3中有一个函数re 可以将3个正则表达式连接在一起 所以我可以构造a b c 如下所示 assert str in re aabbc re re str to re a re str to re b
  • 适用于阿拉伯语、中文和希腊语的 Google TTS API

    我正在尝试从 google TTS API 下载 mp3 文件 这是代码 try String path http translate google com translate tts tl en q hello this is the n
  • Google Analytics API 错误 403:“用户无权访问个人资料”

    我一直在尝试学习如何使用Google Analytics API来获取网站流量数据 我不断遇到错误 提示用户无权访问该配置文件 我将服务帐户中的电子邮件地址添加到用户中 并尝试将其设置为有权访问所有配置文件的用户和管理员 但都不起作用 这是
  • 如何在 golang 结构中声明可为 null 的 json 字段?

    我通常喜欢在结构中使用原始数据类型的指针 这样当我 json Marshal 它们时 nil字段总是被翻译为 field null在 json 字符串中 但这将使创建新的结构实例变得困难 因为我无法使用文字 例如 type Book str
  • 如何在 Windows 启动时最小化应用程序 - Visual Basic

    这段代码有什么问题 我无法在启动时关闭我的应用程序 如果我改变me close 它实现了另一个值 但是对于me close 事实并非如此 我是编码和 Visual Basic 新手 Dim oktoclose As Boolean Priv
  • Twig:允许 HTML,但转义脚本

    我正在调查一个可能的XSS我的应用程序的攻击向量 我拥有的 FormType 带有单个textarea场地 通常该字段可以包含html tags Twig呈现插入数据的模板 我使用该表单插入以下内容 b Some valid HTML te
  • 在 session_destroy() 之后保留会话变量

    从我的 logout php
  • 以编程方式检索流畅配置,无需实例化 DbContext

    我有一个 DbContext 派生类 其成员实体类是使用 Fluent API 配置的 我想以编程方式检索这些配置和关系 执行此操作的代码已经就位 我将其移植到 T4 模板以进行代码生成 虽然大多数代码生成都使用反射 但流畅的配置需要实例化
  • Python - 转发带附件的 IMAP 电子邮件(imaplib、smtplib)

    我在转发带有附件的邮件时遇到问题 有人能指出我正确的方向吗 我猜它在 Fetch 语句中 但我不确定 import sys import uuid import re import smtplib import email address
  • RMI:按值传递还是按引用传递?

    我很难找到这个问题的明确答案 所以我想我应该在这里用我自己的具体例子来问 我正在创建一个多人垄断游戏 实际的垄断代码在服务器上运行 而客户端本质上是一个访问和控制该代码的 GUI 垄断游戏是由一个叫做 银行 的类控制的 假设我在客户端的 m
  • 将变量从 node.js 传递到 html

    我正在尝试将变量从 node js 传递到我的 HTML 文件 app get main function req res var name hello res render dirname views layouts main html
  • 试图获取非对象的属性

    这个脚本效果很好 我在脚本的顶部调用它 但是 如果未被禁止的用户进入该网站 他们会得到 Notice Trying to get property of non object in index php on line 20 功能 Check
  • 有没有办法在没有JFrame的情况下获取键盘事件?

    我想让我的程序在用户按下某个快捷方式时取消隐藏主窗口 有没有办法获取全局关键事件 而不仅仅是焦点位于应用程序框架内时发生的事件 这可能会做你想做的事 请注意 此代码正在检查 Ctr F 击键 我使用此代码从应用程序中的任何内容打开查找对话框
  • 如何创建每个单元格分为 4 个三角形的热图?

    我想将一个单元格分成一个单独的热图 具有多个颜色代码 Each square is divided into 4 triangles and each triangle has its own numerical value color c
  • 如何在直方图中绘制字典中的键和值

    我需要用以下字典绘制直方图 x 5 289 8 341 1 1565 4 655 2 1337 9 226 7 399 3 967 6 405 我需要首先将键从 1 到 9 排序 然后将这些值绘制在直方图中 显示最大概率为 1 0 我已经尝
  • 垂直旋转 JTextField

    我见过很多询问如何以任意角度旋转 JLabel 或图像的问题 我需要做的就是将文本字段旋转 90 度 但我还没有找到专门针对该角度的更简单的方法 我以为我正确复制了答案 但我的文本字段没有旋转 这是我正在做的 SSCCE import ja
  • 如何判断进程是否在用户界面进程中?

    如何从进程中获取它是 UI 用户界面 进程还是非 ui 进程的信息 我所说的 UI 进程是指 Finder Dock 系统 UI 服务器或任何其他具有 UI 界面且由 Window Server 使用的 Mac 应用程序 我想从 Proce
  • 尝试发送 Android 图像时应用程序崩溃

    我在尝试将图像从我的应用程序发送到服务器时遇到问题 我知道它在哪里崩溃 这些是我的文件 RestClient java package edu gvsu cis masl camerademo import android util Log