2022年最新版Android安卓面试题+答案精选(每日20题,持续更新中)【八】

前言

写在前面:首先是不一次性放出来的原因:资料来之不易,希望大家好好珍惜,每天花一段时间细细的消化这些题目,其次希望大家在阅读题目的时候最好跟着书或者代码一起阅读、一起敲,做到熟稔于心,信手拈来,这样面试的时候才能展现你最自信的一面。

141、NativeScript:增强tns平台声明

答案:

最终,我根本不赞成tns-platform-declarations,因为性能非常糟糕(特别是如果您的开发机中的RAM小于等于8GB)。

我的解决方案是定义一个自己的my-typings.d.ts文件(例如,在项目根目录中),在其中定义扩展类型RecyclerView。随着tsconfig.json违约应该自动被追上了tsc。否则可以添加exclude/include或files表达式。

然后,您可以放置一个/// <reference path="path/to/RecyclerView/file.d.ts" />内部,以便ambient global namespaceTypescript编译器可以找到以下内容。

declare namespace android {

  namespace view {
    namespace ViewGroup {
      namespace LayoutParams {
        const MATCH_PARENT;
        const WRAP_CONTENT;
      }
    }
    class ViewGroup {

    }
  }

  namespace support.v7.widget {

    namespace RecyclerView {
      type AdapterImpl = {
        onCreateViewHolder(parent: android.view.ViewGroup, viewType: number): ViewHolder;
        onBindViewHolder(holder: android.support.v7.widget.RecyclerView.ViewHolder, position: number): void;
        getItemCount(): number
      };

      class Adapter {
        static extend(AdapterImpl): { new () }
      }

      class LayoutParams {
        constructor(width: any, height: any);
      }

      class ViewHolder {
        static extend: any;
      }
    }

    class RecyclerView {
      constructor(context: any);

      setAdapter(Adapter): void;
      setLayoutManager(LinearLayoutManager): void;
    }

    class LinearLayoutManager {
      constructor(context: any);
    }

  }
}

基本上,名称空间可用于模拟嵌套的对象属性(例如android.view.xxx)。如果内部类是用Java定义的(Typescript似乎禁止嵌套class语句),这也是这种方式。

在实际使用类型的情况下,我还必须定义一个与名称空间同名的类android.view.ViewGroup。否则你会得到错误

没有出口会员xxx

,即使使用显式声明了类类型export(也没有必要,因为已经全局声明了名称空间)。

对于使用扩展本机Java类型的特殊情况extend,我为相关类定义了一个静态方法,例如static extend(AdapterImpl): { new () },其返回类型可以使用实例化new。

希望对其他类似问题有所帮助。

142、重写旧代码

答案:

诚然,问题涉及到cobol,它会根据您的需求做出任何特定的回答,如果您说“我们有一个旧的VB应用程序”或旧的C应用程序,则选择#3始终是正确的方法。

我曾在3家决定选择方案2的公司工作。第2位破产者试图为新系统付费,而仅从旧版本中获得收益,第3位确实非常接近。

行动3的另一个因素是,您必须保留多年来使用的所有旧错误修正程序。每次重写总是会引入越来越多的错误,部分是因为您希望快速完成重写,部分是因为您将用一种陌生的新语言编写它,部分是因为所有新代码都包含错误。

重构并替换旧应用程序的逻辑块,最终您将拥有一个漂亮的闪亮新应用程序。从GUI开始,以获得最安全的新方法。此外,当您用新内容重新编写应用程序时,更新的内容将是最酷的,新应用程序将过时,您将再次发布相同的问题!

143、如何在Android中以编程方式解压缩文件?

答案:

peno的版本进行了优化。性能的提高是可以察觉的。

private boolean unpackZip(String path, String zipname)
{       
     InputStream is;
     ZipInputStream zis;
     try 
     {
         String filename;
         is = new FileInputStream(path + zipname);
         zis = new ZipInputStream(new BufferedInputStream(is));          
         ZipEntry ze;
         byte[] buffer = new byte[1024];
         int count;

         while ((ze = zis.getNextEntry()) != null) 
         {
             filename = ze.getName();

             // Need to create directories if not exists, or
             // it will generate an Exception...
             if (ze.isDirectory()) {
                File fmd = new File(path + filename);
                fmd.mkdirs();
                continue;
             }

             FileOutputStream fout = new FileOutputStream(path + filename);

             while ((count = zis.read(buffer)) != -1) 
             {
                 fout.write(buffer, 0, count);             
             }

             fout.close();               
             zis.closeEntry();
         }

         zis.close();
     } 
     catch(IOException e)
     {
         e.printStackTrace();
         return false;
     }

    return true;
}
144、NoClassDefFoundError-Eclipse和Android

答案:

更新ADT后出现此问题。

我将所有JAR文件存储在一个名为“ lib”的文件夹中,然后以普通的Eclipse方式将jars添加到构建路径中。直到我更新为止,这个工作正常。

更新之后,我得到了一个我可以清楚地看到它包含在jar中的类的NoClassDefFoundError(签出ReferencedLibraries类)。

解决方案是从构建路径中删除我的jar,然后将“ lib”文件夹重命名为“ libs”。这是一个蚂蚁惯例,似乎是新ADT在.apk文件中查找并包括库的方式。一旦执行此操作,一切正常。

145、如何在Android中将TextView添加到LinearLayout

答案:

尝试使用

LinearLayout linearLayout = (LinearLayout)findViewById(R.id.info);
...
linearLayout.addView(valueTV);

还请确保你正在创建的布局参数是LinearLayout.LayoutParams …

146、JSF 2.0文件上传

答案:

首先,这个(旧的)问答假设为JSF 2.0 / 2.1。从JSF 2.2开始,有了一个本机<h:inputFile>组件,而无需第三方组件库。另请参阅如何使用JSF 2.2 <h:inputFile>上传文件?保存的文件在哪里?

最简单的方法是将Tomahawk用于JSF 2.0。它提供了一个<t:inputFileUpload>组件。

这是一个分步教程:

为Servlet 3.0和JSF 2.0创建一个空白的动态Web项目。在web.xml必须遵守的Servlet 3.0规范,已经包含了JSF的servlet:

<?xml version="1.0" encoding="UTF-8"?>
<web-app 
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    id="YourProjectName" version="3.0">

    <display-name>Your Project Name</display-name>

    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.xhtml</url-pattern>
    </servlet-mapping>

</web-app>

faces-config.xml必须符合JSF 2.0规范:

<?xml version="1.0" encoding="UTF-8"?>
<faces-config
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
    version="2.0">

</faces-config>

下载适用于JSF 2.0的Tomahawk 1.1.10。解压缩zip文件,转到/lib文件夹,然后将所有*.jar文件复制到中/WEB-INF/lib

它是18页的文件,其中batik*.jar和xml*.jar是不必要的单独使用t:inputFileUpload的组件。您可以将它们丢掉。

在中配置Tomahawk扩展过滤器web.xml。它是负责处理multipart/form-data请求的人员,该请求是能够通过HTTP发送文件所必需的。

<filter>
    <filter-name>MyFacesExtensionsFilter</filter-name>
    <filter-class>org.apache.myfaces.webapp.filter.ExtensionsFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>MyFacesExtensionsFilter</filter-name>
    <servlet-name>Faces Servlet</servlet-name>
</filter-mapping>

请注意,<servlet-name>必须完全匹配<servlet-name>FacesServlet与您在definied web.xml

创建一个简单的Facelet upload.xhtml

<!DOCTYPE html>
<html lang="en"
    xmlns="http://www.w3.org/1999/xhtml"
    xmlns:f="http://java.sun.com/jsf/core"
    xmlns:h="http://java.sun.com/jsf/html"
    xmlns:t="http://myfaces.apache.org/tomahawk"
    xmlns:ui="http://java.sun.com/jsf/facelets">
    <h:head>
        <title>Tomahawk file upload demo</title>
    </h:head>
    <h:body>
        <h:form enctype="multipart/form-data">
            <t:inputFileUpload value="#{bean.uploadedFile}" />
            <h:commandButton value="submit" action="#{bean.submit}" />
            <h:messages />
        </h:form>
    </h:body> 
</html>

注意上的enctype="multipart/form-data"属性<h:form>,这对于能够使用HTTP发送文件非常重要。

创建一个简单的托管bean com.example.Bean

package com.example;

import java.io.IOException;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;

import org.apache.commons.io.FilenameUtils;
import org.apache.myfaces.custom.fileupload.UploadedFile;

@ManagedBean
@RequestScoped
public class Bean {

    private UploadedFile uploadedFile;

    public void submit() throws IOException {
        String fileName = FilenameUtils.getName(uploadedFile.getName());
        String contentType = uploadedFile.getContentType();
        byte[] bytes = uploadedFile.getBytes();

        // Now you can save bytes in DB (and also content type?)

        FacesContext.getCurrentInstance().addMessage(null, 
            new FacesMessage(String.format("File '%s' of type '%s' successfully uploaded!", fileName, contentType)));
    }

    public UploadedFile getUploadedFile() {
        return uploadedFile;
    }

    public void setUploadedFile(UploadedFile uploadedFile) {
        this.uploadedFile = uploadedFile;
    }

}

应该的。通过http:// localhost:8080 / projectname / upload.xhtml打开它。

关于您的具体问题:

我应该怎么做才能将文件从JSF传递到托管bean,然后将其转换为byte [](以便能够将其处理到EJB)?

上面已经回答了。

servlet如何帮助我?

它能够处理和控制HTTP请求/响应。在JSF环境中,FacesServlet已经完成了所有工作。

我需要一个servlet来做到这一点吗?

在JSF环境中,FacesServlet必选。但是API已经提供了它,您不需要自己编写。但是,为了能够从数据库下载文件,另一个servlet绝对有用。您可以在此处找到一个基本示例:用于提供静态内容的Servlet。

我也发现在某个博客中提到了servlets 3.0,但是我不知道我的工作环境是否正在使用它,如果我正在使用servlets 3.0(我正在使用JEE6)怎么办?

如果您使用的是Servlet 3.0容器,例如Glassfish 3,JBoss AS 6,Tomcat 7等,并且web.xml声明为Servlet 3.0,那么您肯定是在使用Servlet 3.0。Servlet 3.0是Java EE 6的一部分。

147、Eclipse控制台:检测警告和错误模式并使它们可单击

答案:

编辑: 我发现了一个插件,可以使外观更加美观:Sunshade Errorlink(向下滚动一点)。我不确定这到底有多灵活,但它提到了蚂蚁的支持。

我知道您可能想要一个实际的实现,但这是您想要的插件设计的一个粗略起点。如果有人想实现它,请在此处添加指向它的链接。如果我有空闲时间,我可能会自己做(哈!)😃

该规范假设控制台基于TextConsole,这似乎是合理的,它说:

支持正则表达式匹配和超链接的抽象文本控制台。

模式匹配侦听器可以通过控制台或通过org.eclipse.ui.console.consolePatternMatchListeners 扩展点进行注册。

我做了一些查找,该扩展点的规范具有以下示例:

<extension point="org.eclipse.ui.console.consolePatternMatchListener">
  <consolePatternMatchListener
    class="com.example.ExampleConsolePatternMatcher"
    id="com.example.ExampleConsolePatternMatcher"
    regex=".*foo.*">
    <enablement>
      <test 
        property="org.eclipse.ui.console.consoleTypeTest"
        value="exampleConsole"/>
    </enablement>
  </consolePatternMatchListener>
</extension>

您将需要IPatternMatchListenerDelegate的API,然后应该能够使用TextConsole.addHyperlink创建所需的链接。

148、Android的换行小部件布局

答案:

你可以通过在build.gradle文件中添加依赖项来在项目中使用它:

dependencies {
    compile 'com.google.android:flexbox:0.3.2'
}

我做了自己想要的布局,但是目前还很有限。欢迎提出意见和改进建议。

活动:

package se.fnord.xmms2.predicate;

impor
  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值