小编Kha*_*los的帖子

Android Instrumentation测试 - UI线程问题

我正在尝试为我的Android应用程序编写一个Instrumentation Test.

我遇到了一些奇怪的线程问题,我似乎无法找到解决方案.

我的原始测试:

@RunWith(AndroidJUnit4.class)
public class WorkOrderDetailsTest {

    @Rule
    public ActivityTestRule<WorkOrderDetails> activityRule = new ActivityTestRule<>(WorkOrderDetails.class);

    @Test
    public void loadWorkOrder_displaysCorrectly() throws Exception {
        final WorkOrderDetails activity = activityRule.getActivity();

        WorkOrder workOrder = new WorkOrder();
        activity.updateDetails(workOrder);

        //Verify customer info is displayed
        onView(withId(R.id.customer_name))
                .check(matches(withText("John Smith")));
    }
}
Run Code Online (Sandbox Code Playgroud)

这导致了一个

android.view.ViewRootImpl $ CalledFromWrongThreadException:只有创建视图层次结构的原始线程才能触及其视图.

...

com.kwtree.kwtree.workorder.WorkOrderDetails.updateDetails(WorkOrderDetails.java:155)

这个updateDetails()方法唯一能做的就是一些setText()调用.

经过一番研究后,似乎在我的测试中添加一个UiThreadTestRuleandroid.support.test.annotation.UiThreadTest注释可以解决问题.

@UiThreadTest:

@RunWith(AndroidJUnit4.class)
public class WorkOrderDetailsTest {

    //Note: This is new
    @Rule
    public UiThreadTestRule uiThreadTestRule = new UiThreadTestRule();

    @Rule
    public ActivityTestRule<WorkOrderDetails> …
Run Code Online (Sandbox Code Playgroud)

java testing junit multithreading android

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

使用Parse Twitter/Facebook身份验证注销或切换帐户

我正在使用parse.com的Android API并添加了Facebook/Twitter登录支持.这工作正常.

棘手的部分似乎正在退出.

如果我使用Twitter登录我的应用程序:

ParseTwitterUtils.logIn(UserLoginActivity.this, twitterLoginCallback);
Run Code Online (Sandbox Code Playgroud)

或使用Facebook:

ParseFacebookUtils.logInWithReadPermissionsInBackground(UserLoginActivity.this, null, facebookLoginCallback);
Run Code Online (Sandbox Code Playgroud)

我在网络对话框中提示输入我的Twitter凭据,然后允许或拒绝访问我的应用程序.一旦我允许它,我能够成功登录,并且我可以访问我的屏幕名称.一切都很好!

当我尝试登录我的ParseUser的,我确实会退出.但是,如果我再次单击Facebook或Twitter登录按钮,我会预先验证为我之前的帐户,我无法切换帐户.

我试过了:

  • 检查Chrome和浏览器,但都没有登录Twitter.
  • 退出原生Twitter/Facebook应用程序

我的登录逻辑简单地开始:

ParseUser.logOut();
Run Code Online (Sandbox Code Playgroud)

对于Twitter,我尝试过

  • 卸载我的应用程序 - 这确实解决了它,但不是一个理想的解决方案.
  • Parse.enableLocalDatastore(this);按照我的Application建议打电话:https://stackoverflow.com/a/26338326/494356
  • 按照此处的建议取消链接Twitter帐户:https://stackoverflow.com/a/34052718/494356.这也有每次创建一个新的ParseUser的坏副作用(但仍然是相同的Twitter帐户)
  • 我尝试将权限从"只读"更改为"读写",如/sf/answers/1939991161/所示.(为什么这对我来说无关紧要对我没有意义)
  • 我试过将AuthToken设置为 null ParseTwitterUtils.getTwitter().setAuthToken(null); ParseTwitterUtils.getTwitter().setAuthTokenSecret(null);

对于Facebook,我试过了

  • 卸载我的应用程序-这并没有解决问题.
  • 使用Facebook SDK注销功能:

    AccessToken.setCurrentAccessToken(null);

    Profile.setCurrentProfile(null);

    LoginManager.getInstance().logOut();

  • 曾经有一Session.closeAndClearTokenInformation()所建议的在这里.但是Facebook已经弃用了Session类,它不再在SDK中了.

  • 按照此处的建议取消关联Facebook帐户.这又导致重复的ParseUsers,我仍然可以使用保存的凭据登录.

我真的很感激任何答案或建议.即使你只能回答推特或Facebook,但两者都不能回答,我仍然希望听到它.

authentication twitter android facebook parse-platform

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

屏幕超时时未显示Unity3D Android锁屏.(激活锁定?)

我正在使用Unity构建一个Android应用程序,它正在顺利进行.但是,我有一个奇怪的问题,有关屏幕超时和锁屏没有显示.

应该发生什么

  • 用户停止播放
  • 屏幕超时并关闭
  • 之后,玩家返回并重新打开手机
  • 锁屏显示,用户可以输入密码或以其他方式解锁手机
  • 应用程序重新获得关注并继续

怎么了

  • 用户停止播放
  • 屏幕超时并关闭
  • 之后,玩家返回并重新打开手机
  • 锁屏确实显示!该应用程序正确聚焦,一起绕过锁屏
  • 用户生气,他们的安全性受到损害:(

笔记

  • 无论我是否使用Android插件,都会发生这种情况
  • 我正在使用Unity 4.2.0f4(尽管更新版本的更改日志对此问题没有任何意义)
  • 它甚至发生在一个空白的Android项目上
  • 我在5种不同的设备上测试了这个,都有同样的问题

我怀疑这是由于在屏幕超时时Unity不放弃的唤醒锁定引起的.这会导致应用程序保持焦点,锁屏永远不会"加载".这是一个非常严重的问题.

有谁知道有任何方法来解决这个问题?

注意:我已经在一周前的Unity Answers上问过这个问题,但还没有得到任何回复.我想也许我在这里有更好的运气.

android unity-game-engine lockscreen wakelock

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

使用WebClient下载torrent文件会导致文件损坏

我正在尝试在我的.NET应用程序中下载.torrent文件(不是torrent本身的内容).

使用以下代码适用于其他文件,但不适用于.torrent.生成的文件比通过浏览器下载文件小约1-3kb.在torrent客户端打开它时,它说洪流已损坏.

WebClient web = new WebClient();
web.Headers.Add("Content-Type", "application/x-bittorrent");
web.DownloadFile("http://kat.ph/torrents/linux-mint-12-gnome-mate-dvd-64-bit-t6008958/", "test.torrent");
Run Code Online (Sandbox Code Playgroud)

在浏览器中打开URL会导致文件正确下载.

有关为什么会发生这种情况的任何想法?是否有正确下载文件的WebClient有什么好的替代方案?

编辑:我和WebClient一样尝试了这个,它导致了同样的事情:

private void DownloadFile(string url, string file)
    {
        byte[] result;
        byte[] buffer = new byte[4096];

        WebRequest wr = WebRequest.Create(url);
        wr.ContentType = "application/x-bittorrent";
        using (WebResponse response = wr.GetResponse())
        {
            using (Stream responseStream = response.GetResponseStream())
            {
                using (MemoryStream memoryStream = new MemoryStream())
                {
                    int count = 0;
                    do
                    {
                        count = responseStream.Read(buffer, 0, buffer.Length);
                        memoryStream.Write(buffer, 0, count);

                    } while (count != 0);

                    result = memoryStream.ToArray();

                    using (BinaryWriter writer = …
Run Code Online (Sandbox Code Playgroud)

.net c# webclient

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