小编mal*_*din的帖子

使用try/catch防止应用程序崩溃

我一直在研究一款try/catch经常使用的Android应用程序,以防止它甚至在没有必要的地方崩溃.例如,

xml layout带有的视图id = toolbar引用如下:

// see new example below, this one is just confusing
// it seems like I am asking about empty try/catch
try {
    View view = findViewById(R.id.toolbar);
}
catch(Exception e) {
}
Run Code Online (Sandbox Code Playgroud)

整个应用程序都使用此方法.堆栈跟踪没有打印,很难找到出错的地方.应用程序突然关闭而不打印任何堆栈跟踪.

我让我的大四学生向我解释,他说,

这是为了防止生产中的崩溃.

我完全不同意它.对我而言,这不是阻止应用程序崩溃的方法.它表明开发人员知道他/她在做什么,并且有疑问.

这是行业中使用的方法,以防止企业应用程序崩溃?

如果try/catch是真的,那么我们真的需要可以附加一个带有UI线程或其他线程的异常处理程序并捕获所有内容吗?如果可能的话,那将是更好的方法.

是的,空try/catch是坏的,即使我们将堆栈跟踪或日志异常打印到服务器,try/catch在所有应用程序中随机包装代码块对我来说没有意义,例如当每个函数都包含在a中时try/catch.

UPDATE

由于这个问题引起了很多关注,有些人误解了这个问题(也许是因为我没有明确表达过),我将把它改写一下.

这是开发人员在这里做的事情

  • 一个函数被编写和测试,它可以是一个小函数,它只是初始化视图或复杂的视图,在测试后它被包裹在try/catch块中.即使是永远不会抛出任何异常的函数.

  • 这种做法在整个申请中使用.有时会打印堆栈跟踪,有时只会出现debug log一些随机错误消息.此错误消息因开发人员而异.

  • 使用这种方法,应用程序不会崩溃,但应用程序的行为变得不确定.甚至有时候很难跟上出错的地方.

  • 我一直在问的真正问题是; 为了防止企业应用程序崩溃,业界是否遵循这种做法?而且我不是在询问空的try/catch.是不是,用户喜欢不会比意外行为的应用程序崩溃的应用程序?因为它真的归结为崩溃或用空白屏幕呈现用户或行为用户不知道.

  • 我在这里发布了一些真实代码的片段

      private void …
    Run Code Online (Sandbox Code Playgroud)

java android design-patterns coding-style try-catch

77
推荐指数
5
解决办法
2万
查看次数

使用Intellij 2016创建Jar - 没有主要清单属性

我正在no main manifest attribute运行由Intellij创建的jar.我提取了jar并观察到有另一个清单文件,而不是我在创建工件时指定的文件.

当我在IDE中打开清单时,它会正确显示所有内容,但在创建jar后,我会得到一个全新的清单文件.

Manifest-Version: 1.0
Main-Class: YoutubeList
Run Code Online (Sandbox Code Playgroud)

我尝试了其他答案中的每个解决方案,但仍然没有做到正确.为什么创建一个简单的jar是Intellij中的一项任务,它应该可以帮助开发人员!

编辑

有时它不包括Jar中的.class文件 could not found or load class

java jar intellij-idea

32
推荐指数
4
解决办法
4万
查看次数

动画活动不属于您的应用

如何对不属于我的应用程序的活动应用结束转换.说,我正在打开联系人应用程序以选择联系人,我在打开联系人应用程序时应用向上滑动转换但关闭应用程序应用默认动画(向左滑动).

是否有可能在关闭时设置动画?

user-interface animation android android-activity

11
推荐指数
1
解决办法
287
查看次数

Dagger 找不到其他注解处理器生成的类

我编写了一个简单的 Annotation Processor(只是为了好玩),它将生成一些我在之前的项目中编写的样板代码。它实际上通过收集 Activity 类的注释来生成如下模块

@Module
abstract class ActivityInjectorModule {
  @ContributesAndroidInjector
  abstract fun providesMain2Activity(): Main2Activity

  @ContributesAndroidInjector
  abstract fun providesMainActivity(): MainActivity
}
Run Code Online (Sandbox Code Playgroud)

但是,当我使用 dagger 运行它时,dagger 似乎无法找到我的 annotation processor 生成的类。虽然生成了类并存在于生成的目录中,但我可以在我的源代码中使用它,但是在编译时,dagger 会产生以下异常。有什么专家建议吗?

error: cannot find symbol
@dagger.Component(modules = {dagger.android.AndroidInjectionModule.class, com.mallaudin.daggietest.di.AppModule.class, ActivityInjectorModule.class})
                                                                                                                       ^
  symbol: class ActivityInjectorModule
Run Code Online (Sandbox Code Playgroud)

这是主要的应用程序组件。

@Singleton
@Component(
    modules = [
        AndroidInjectionModule::class,
        AppModule::class,
        ActivityInjectorModule::class
    ]
)
interface AppComponent : AndroidInjector<App> {


    @Component.Builder
    interface Builder {

        fun addContext(@BindsInstance ctx: Context): Builder

        fun build(): AppComponent
    }
}
Run Code Online (Sandbox Code Playgroud)

ActivityInjectorModule类由注解处理器生成,存在于生成目录中。

应用类

class App : …
Run Code Online (Sandbox Code Playgroud)

java android annotation-processing dagger-2 annotation-processor

11
推荐指数
2
解决办法
2321
查看次数

使用View Pager进行循环滚动

我们需要通过滑动图像协调旋转轮.我已经使用了ViewPager但是在360度旋转之后

我必须从X = 0开始滚动ViewPager.是否有任何ViewPager在滚动到最后位置后从第一页开始?

我使用setScrollX来滚动ViewPager,它也会在旋转动画中引入毛刺.我想要实现像下面的图像.

这是示例应用程序的链接,只是我想要实现的最小化实现.

在此输入图像描述

android infinite-scroll android-scrollview android-viewpager android-scrolling

10
推荐指数
1
解决办法
704
查看次数

停止显示来自输出的欢迎使用 Gradle 消息

我正在从命令行运行 gradle 命令,我只想显示输出。有一个选项 -q, -quiet 表示它只会记录错误。运行命令后,我也得到了这个带有输出的废话。我怎么能阻止这个??

Welcome to Gradle 2.11.

To run a build, run gradle <task> ...

To see a list of available tasks, run gradle tasks

To see a list of command-line options, run gradle --help

To see more detail about a task, run gradle help --task <task>
Run Code Online (Sandbox Code Playgroud)

gradle gradle-task

7
推荐指数
2
解决办法
1769
查看次数

通过辅助构造函数初始化Kotlin Data Class上的val属性

class Animal {
    val name: String

    constructor(name: String){
        this.name = name // initialized via constructor
    }
}
Run Code Online (Sandbox Code Playgroud)

对于上面的类,Kotlin我能够通过辅助构造函数初始化val属性,但Data类不允许这样做

data class User(val name: String, val postalCode: Int) {
    val email: String

    constructor( email: String): this("", 1){
        this.email = email // error: value can not be reassigned
    }

}
Run Code Online (Sandbox Code Playgroud)

我无法理解的是,电子邮件属性已经初始化,因为我还没有声明任何初始化?

kotlin data-class

6
推荐指数
1
解决办法
1547
查看次数

更改弹出菜单背景颜色

注意:我搜索了一个小时并尝试了stackoverflow已经提供的所有解决方案.

我正在研究主题叠加.我制作了一个示例应用程序,它会在单击操作栏图标时打开一个弹出菜单.这是我的styles.xml

<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>

    </style>

    <style name="AppTheme.NoActionBar">
        <item name="windowActionBar">false</item>
        <item name="windowNoTitle">true</item>
    </style>



    <style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Light">
        <item name="android:textColorPrimary">@color/colorAccent</item>
    </style>

    <style name="AppTheme.PopupOverlay" parent="ThemeOverlay.AppCompat.Dark">
        <!-- added all to see which one will work.-->
        <item name="android:popupMenuStyle">@style/PopupMenu</item>
        <item name="android:itemBackground">@color/colorAccent</item>
        <item name="android:colorBackground">@color/colorAccent</item>

    </style>

    <style name="PopupMenu" parent="@android:style/Widget.PopupMenu">
        <item name="android:popupBackground">@color/colorAccent</item>
    </style>

</resources>
Run Code Online (Sandbox Code Playgroud)

这是我的工具栏样式.

   <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:popupTheme="@style/AppTheme.PopupOverlay"/>

    </android.support.design.widget.AppBarLayout>
Run Code Online (Sandbox Code Playgroud)

我把它设置为popupTheme我的 …

android themes android-layout android-theme android-toolbar

5
推荐指数
2
解决办法
1万
查看次数

从命令行运行时混合 java 和 kotlin 代码的 ClassNotFoundException

我有混合JavaKotlin中,我想从运行演示项目的代码command line。仅对于 java,我可以运行该程序,java -jar foo.jar但是当我使用Kotlin代码中的任何类时,它会生成java.lang.NoClassDefFoundError: kotlin/jvm/internal/Intrinsics

我尝试了不同的解决方案并检查了jar文件。它包含这两个类,但我想kotlin-runtimejar 中缺少它。

这是build.gradle文件

plugins {
    id 'java-library'
    id 'org.jetbrains.kotlin.jvm'
}

sourceSets {
    main.java.srcDirs += 'src/main/kotlin/'
    test.java.srcDirs += 'src/test/kotlin/'
}

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
    testImplementation 'junit:junit:4.12'
}

jar {
    manifest {
        attributes 'Main-Class': 'com.mallaudin.App'
    }
    from {
        configurations.compile.collect {
            it.isDirectory()? it: zipTree(it)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

生成jar文件的内容

.
??? com
?   ??? mallaudin
?       ??? App.class …
Run Code Online (Sandbox Code Playgroud)

java command-line compilation gradle kotlin

5
推荐指数
1
解决办法
4958
查看次数

从字段元素 - 注释处理器获取包名称和参数化类型

我怎样才能获得package name,generic type并且Parametrized typetypefield element在注释处理器?

说,如果Element.asType回来java.util.List<String>,我想得到

  • 包裹名字 java.util
  • 通用类型List<E>或原始类型List(最好是原始类型)
  • 实际类型 String

有没有方法element utils,type utils

java annotations annotation-processing annotation-processor

4
推荐指数
1
解决办法
1440
查看次数