小编Rob*_*ert的帖子

Javadoc链接到其他类中的方法

目前我正在使用这种Javadoc语法引用其他类中的方法:

@see {@link com.my.package.Class#method()}
Run Code Online (Sandbox Code Playgroud)

根据我从文档中的理解,这是正确的方法.但现在到了有趣的部分,还是令人沮丧.当我生成这个javadoc时,我首先得到以下错误:

warning - Tag @see:illegal character: "123" in "{@link com.my.package.Class#method()}"
warning - Tag @see:illegal character: "64" in "{@link com.my.package.Class#method()}"
warning - Tag @see: reference not found: {@link com.my.package.Class#method()}
Run Code Online (Sandbox Code Playgroud)

生成的HTML代码是:

"," <code>com.my.package.Class#method()}</code> ","
Run Code Online (Sandbox Code Playgroud)

当然,我没有联系.任何人都可以告诉我发生了什么,以及如何解决这个问题的任何提示?

根据ASCII表格,字符123和64代表{和@,那么根据文档,当这种语法正确时,为什么这些字符不能有效?

java javadoc

219
推荐指数
3
解决办法
20万
查看次数

检测TextView是否跨越2行

我想知道是否有任何方法可以检测到文本视图中的字符串是否到达屏幕的末尾并因此更改行,或者如果textview跨越2行?

我想知道这一点,所以如果textview跨越2行,我可以增加一些textviews之间的边距,当然我想动态地这样做.

android textview android-layout

20
推荐指数
1
解决办法
8450
查看次数

记录最佳实践和想法

我即将对我的应用程序进行一些重构,然后我开始思考这个简单而复杂的主题,日志记录,如何做到干净,有效和信息丰富的日志记录......

当您阅读有关日志记录的文档时,您经常会看到此代码段

if (BuildConfig.DEBUG) {
    Log.d(TAG + "message");
}
Run Code Online (Sandbox Code Playgroud)

它让我想知道它的目的是什么?根据文档Android Developer - Log,调试日志消息被编译但在运行时被剥离,因此您不需要在该if语句中进行日志调用.还是我想知道什么?

然后我也想知道使用除调试之外的任何其他Log.x()调用的真正好处是什么,因为用户不会看到日志条目或登录到某些错误文件,因此它们将被编译并执行在生产环境中没有任何目的?这可能是之前if语句的用例?

我之前提到过,日志条目没有记录到文件中.为什么这不是Android的内置功能?是因为性能问题,不必要的权限使用还是别的?我已经在我自己的日志类中实现了这个功能,但现在我想知道这是不好的做法?但是拥有重要日志条目的日志也很好吗?

因此,要在开发和生产过程中实现清洁,有效和信息丰富的日志记录.什么是最佳做法?

logging android logcat

19
推荐指数
3
解决办法
1万
查看次数

模拟或构建Jersey InboundJaxrsResponse

我是一个相当新的开发球衣客户端,并在一些测试中遇到了一些问题.首先,我可能应该提到我的应用程序是所有客户端,没有服务器端的东西.

我的问题是我想创建一个Response实例的对象InboundJaxrsResponse,到目前为止,我试图通过模拟Response使用Mockito和实现这一点ResponseBuilder.build()

使用Mockito:

Response response = mock(Response.class);
when(response.readEntity(InputStream.class))
    .thenReturn(ClassLoader.getSystemResourceAsStream("example_response.xml");
Run Code Online (Sandbox Code Playgroud)

这工作正常,当我读出响应的实体时,response.readEntity(InputStream.class) 我得到了预期的实体.但是我需要多次从响应中读取实体.为了实现这一点,我response.bufferEntity()在读出实体之前使用.我第一次阅读实体一切正常,但第二次我得到一个异常I/O stream closed......好吧我想出了嘲笑方法bufferEntity,如下所示:

Response response = mock(Response.class);
when(response.bufferEntity()).thenCallRealMethod();
when(response.readEntity(InputStream.class))
    .thenReturn(ClassLoader.getSystemResourceAsStream("example_response.xml");
Run Code Online (Sandbox Code Playgroud)

但这只是导致错误被调用时抛出bufferEntity(),这是因为bufferEntity()Responseabstract.

我的另一个尝试是通过使用ResponseBuilder.build()如下:

ResponseBuilder responseBuilder = Response.accepted(ClassLoader.getSystemResourceAsStream("example_response.xml"));
Response response = responseBuilder.build();
Run Code Online (Sandbox Code Playgroud)

这个声明很好,通过调试我的响应我可以看到它有正确的实体等等.但是这次当我打电话的时候,我response.bufferEntity()得到一个异常抛出,说这个操作是非法的,OutboundJaxrsResponse所以通过这种方式构建响应会导致错误的实例Response.class:

所以最终有三个问题.

  1. 这是否可以模拟/构建此类型的对象进行测试?
  2. 有没有办法模拟入站响应?
  3. 有没有一种办法,而不是创建的实例OutboundJaxrsResponseResponseBuilder.build()创建的实例InboundJaxrsResponse,或至少铸造/实例转换OutboundJaxrsResponse到的实例OutboundJaxrsResponse

java unit-testing jersey jersey-client java-ee-7

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

短信接收器的"真实"测试

我有一个SmsReceiver我想在设备上测试真实的,但是我不愿意将一堆真正的短信发送到我的设备上,这会堆积我的电话费;-)

所以我认为我必须能够intent采取行动RECEIVED_SMS,短信数据和发送短信所需的所有其他东西.在谷歌快速浏览之后,我最终来到这里:http://blog.dev001.net/post/14085892020/android-generate-incoming-sms-from-within-your-app.我从这篇文章中得到了一些想法并制作了我的杀手级Android应用程序,用于在设备上创建和"发送"短信用于测试目的,我必须说它有点像魅力,除了我的接收器onReceive没有被调用,发送的短信直接进入收件箱.我知道我的接收器工作,如果我发送一个真正的短信到我的设备它触发,如果我发送短信从DDMS到模拟器它也触发,所以这应该没问题.

那么我想念的是什么permissions,某些Intent.putExtras或其他东西?任何提示都非常有用,如果能够实现这一点,它将有助于我测试和开发我的应用程序.

我的接收器在清单中:

<receiver android:name=".SmsReceiver">
     <intent-filter android:priority="1000"> 
        <action android:name="android.provider.Telephony.SMS_RECEIVED"/> 
     </intent-filter> 
</receiver>
Run Code Online (Sandbox Code Playgroud)

清单中的权限(接收申请):

<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.WRITE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.VIBRATE" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />  
Run Code Online (Sandbox Code Playgroud)

清单中的权限(发送应用程序):

<uses-permission android:name="android.permission.BROADCAST_SMS"/>
Run Code Online (Sandbox Code Playgroud)

还应该提到在LogCat或控制台中没有出现任何错误.

sms android broadcastreceiver android-intent

9
推荐指数
1
解决办法
1022
查看次数

是否可以使用 Intent.ACTION_GET_CONTENT 传递额外数据

我的问题很简单。是否有可能以某种方式传递额外数据Intent.ACTION_GET_CONTENT,其中Activity接收的Intent,在它的onActivityResult()可以读出?

现在,我尝试使用某种标准传递一些数据,putExtra()但该数据在到达我的活动的途中消失了。使用以下代码设置意图。

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("audio/*");
intent.putExtra(CURRENT_REQUEST_CODE_TAG, getTargetRequestCode());
getActivity().startActivityForResult(intent, ADD_SIGNAL_REQUEST_CODE);
Run Code Online (Sandbox Code Playgroud)

正如我所说,当我在我的活动中获得意图时,额外的数据就消失了。是否有某种方法可以标记或设置意图,以便保留额外的数据或我遗漏的其他内容?

如果这是不可能的,是否还有其他类型的默认/标准方法可以做到这一点?笔记。我不想为此使用“共享首选项”。

谢谢!

更新

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    int currentRequestCode = data.getIntExtra(CURRENT_REQUEST_CODE_TAG, -1);
}
Run Code Online (Sandbox Code Playgroud)

在我的 onActivityForResult() 中,getIntExtra()总是返回默认值 -1,而不是我配置意图的默认值,它应该是值 9 或 10。这告诉我额外的数据已经丢失,并且数据对象的调试证实了我的怀疑,intent 参数不包含任何额外的数据。

似乎我发送的意图与在我的 onActivityResult() 中收到的意图不同。我理解这种行为,因为在我的情况下,默认的 Android 文件选择器被打开,让用户选择一个正确的 MIME 类型的文件,当用户选择一个文件时,我猜会使用所选文件的 URI 创建一个新的 Intent,但是为什么额外的数据消失了,不应该保留吗?

android android-intent

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

android中的Listview和对话框

我有一个小的自定义对话框,我有一个带有id:list的ListView.我想用我的资源中的字符串填充它(R.array.tones),但是我有很大的问题使这个工作,尝试了许多不同的解决方案这是最新的我认为会工作,但它会抛出一个空指针toneList上的异常.

    Dialog dialog = new Dialog(this);

    dialog.setContentView(R.layout.tone_dialog);
    dialog.setTitle(R.string.tonePromptTitle);
    ListView toneList = (ListView)findViewById(R.id.list);

    ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.tones, android.R.layout.simple_list_item_1);

    toneList.setAdapter(adapter);

    dialog.show();
Run Code Online (Sandbox Code Playgroud)

我的类只是扩展Activity而不是ListActivity,我想这样做,否则我必须为listview创建一个新类.我为长代码道歉,我是新来的,还没有真正弄清楚所有的功能.

android listview listactivity customdialog android-activity

0
推荐指数
1
解决办法
1970
查看次数

将对象强制转换为List &lt;String&gt;时发生ClassCastException

我正在开发Android应用程序,并且已经实现了使用共享首选项进行所有处理的类。此类拥有用于获取首选项的通用方法,该方法具有通用性,它根据参数中的类型返回不同类型的数据类型。我存储到共享首选项和从共享首选项检索的数据类型为整数,字符串,布尔值和列表(使用JSON将列表序列化/反序列化到字符串或从字符串反序列化)。好了,一切都很好,我可以通过这种方式从共享的偏好中成功获取int,string和boolean,但不能成功获取List,因此我得到了:

java.lang.ClassCastException: java.lang.String cannot be cast to java.util.List
Run Code Online (Sandbox Code Playgroud)

我忘了告诉我们该方法已声明要返回一个Object,并且在调用该方法时,将返回值类型转换为正确的类型。无论如何,我不明白为什么它说不能转换字符串,甚至不返回字符串?这是执行此操作的正确方法吗,我的意思是返回对象然后进行转换完全正确。

以下用于获取共享首选项的完整方法。感谢您的任何建议!

public Object getPrefs(String sharedPreferences, String key, int type,
        Context context, Object defaultObject) {
    // A String indicating an error occurred while retrieving shared
    // preferences
    final String ERROR = "ERROR";

    // Set shared preferences from context
    sharedPref = context.getSharedPreferences(sharedPreferences,
            Context.MODE_PRIVATE);

    switch (type) {
    case (0): // <-- Integer
        // Check that defaultObject is of correct instance else collect
        // "hardcoded" default value of 0
        if (defaultObject instanceof Integer) {
            this.logger.logCatTxt( …
Run Code Online (Sandbox Code Playgroud)

java android classcastexception

-2
推荐指数
1
解决办法
1318
查看次数