小编Evi*_*n1_的帖子

"预计BEGIN_OBJECT,但在第1行第1列STRING"

我有这个方法:

public static Object parseStringToObject(String json) {
    String Object = json;
    Gson gson = new Gson();
    Object objects = gson.fromJson(object, Object.class);
    parseConfigFromObjectToString(object);
    return objects;
}
Run Code Online (Sandbox Code Playgroud)

我想解析一个JSON:

public static void addObject(String IP, Object addObject) {
    try {
        String json = sendPostRequest("http://" + IP + ":3000/config/add_Object", ConfigJSONParser.parseConfigFromObjectToString(addObject));
        addObject = ConfigJSONParser.parseStringToObject(json);
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}
Run Code Online (Sandbox Code Playgroud)

但是我收到一条错误消息:

com.google.gson.JsonSyntaxException:java.lang.IllegalStateException:预期为BEGIN_OBJECT但在第1行第1列为STRING

java parsing json gson

108
推荐指数
5
解决办法
25万
查看次数

应该在哪里设置'app:layout_behavior'?

它应该在AppBarLayout兄弟的父母或其兄弟姐妹的第一个Scrollable View中设置吗?


使用Material Design for Android,有些视图可以让我们根据周围环境处理布局的行为,其中一个是CoordinatorLayout,正如CodePath指南所提到的:

CoordinatorLayout扩展了完成许多Google Material Design滚动效果的功能.目前,此框架中提供了多种方法,使其无需编写您自己的自定义动画代码即可工作.

我现在感兴趣的是:

  • 扩展或收缩工具栏或标题空间以为主要内容腾出空间.

因此,我们将AppBarLayout与带有set 的工具栏app:layout_scrollFlags和另一个与AppBarLayout一起使用的ViewGroup兄弟一起使用app:layout_behavior.

我的问题是:我们应该把它放在什么样的ViewGroup(或者View) app:layout_behavior


到目前为止,我已经尝试过(而且他们都已经工作了,他们都是AppBarLayout的兄弟姐妹):

  • 滚动视图

  • 可滚动视图中的第一个ViewGroup

  • ViewGroup内的ScrollView

而这一个没有用:

  • 没有Scrollable View子集的ViewGroup.

在线有多个例子,但没有一个真正说明你应该把它放在哪里,比如:

http://www.ingloriousmind.com/blog/quick-look-on-the-coordinatorlayout/ https://guides.codepath.com/android/Handling-Scrolls-with-CoordinatorLayout https://developer.android.com /training/basics/firstapp/building-ui.html https://www.bignerdranch.com/blog/becoming-material-with-android-design-support-library/

android vertical-scrolling android-layout material-design android-coordinatorlayout

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

第一次加载后,Turnbased匹配消失

我正在使用Google Play服务开发Android游戏,以创建基于回合的匹配.

起初一切都很好,我为登录用户加载了turnbased匹配

Games.TurnBasedMultiplayer.loadMatchesByStatus(getApiClient(),
        new int[]{TurnBasedMatch.MATCH_TURN_STATUS_MY_TURN,
                TurnBasedMatch.MATCH_TURN_STATUS_THEIR_TURN,
                TurnBasedMatch.MATCH_TURN_STATUS_INVITED,
                TurnBasedMatch.MATCH_TURN_STATUS_COMPLETE})
        .setResultCallback(this);
Run Code Online (Sandbox Code Playgroud)

它总是加载任何给定状态的所有匹配.但是从上周末开始调用回调但是没有匹配,因为我没有参与任何匹配(状态响应没问题).我在手机上删除了Google Play服务的缓存,然后重新启动了设备.在那一刻,所有比赛再次显示,直到我下次打开应用程序.所有比赛都失踪了.一旦我开始新的比赛,比赛将继续显示上述方法(刷新列表),直到我关闭应用程序.在下一次发布时,比赛也消失了.

我不得不说游戏尚未发布,但在Google Play开发者控制台的测试阶段.我在模拟器上发现了同样的问题.它运行好几天但突然遇到了与我的真实设备相同的问题(后来的构建因此不是单个代码更改导致这一点).

有没有其他人注意到这种行为或有关于如何解决它的想法?

可能与多个应用程序连接到一个游戏有关?我有两个连接调试证书签名的应用程序,今天下午为签名的apk添加了一个.当我使用签名的apk时,它再次起作用,直到我部署了一个新的测试应用程序(debug signed).切换回签名的apk后,错误仍然存​​在.

由于似乎没有人知道答案让我重新解释这个问题.我应该自己在设备上缓存TurnBasedMatches吗?我刚刚删除了播放服务缓存并重新打开了我的应用程序.结果?数百个游戏的列表(因为我每次测试时都必须开始一个新游戏...)

我的代码来处理loadMatchesResult

@Override
public void onResult(TurnBasedMultiplayer.LoadMatchesResult loadMatchesResult)
{
    showToast("GotMatches status: " + loadMatchesResult.getStatus().getStatusCode());

    //add matches to listview (only caching matchId, no references to turnbasedmatch)

    loadMatchesResult.getMatches().getMyTurnMatches().close();
    loadMatchesResult.getMatches().getInvitations().close();
    loadMatchesResult.getMatches().getTheirTurnMatches().close();
    loadMatchesResult.getMatches().getCompletedMatches().close();
    loadMatchesResult.release();

}
Run Code Online (Sandbox Code Playgroud)

找到另一个兴趣点..它开始看起来像在设备上部署新的apk时出现的问题...一旦我部署新的apk(通过从谷歌播放安装alpha版本或从Android Studio直接调试版本)匹配消失了.当我不更改apk时,我可以重新启动手机/关闭应用程序,它工作正常...

如果我通过Play商店更新应用程序也会出现问题......应该有更多人遇到此问题!

android google-play-services google-play-games

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

如何通过PendingIntent发送数据到广播?

我正在尝试通过PendingIntent一些额外的数据发送,例如:

MyMessage message;
//...
Intent intent;
SmsManager sms = SmsManager.getDefault();
intent = new Intent(Constants.SENT_PLAIN);
intent.putExtra(Constants.EXTRA_RAW_ID, message.getId()); //putting long id (not -1L)
PendingIntent sentPI = PendingIntent.getBroadcast(activity, 0, intent, 0);
intent = new Intent(Constants.DELIVERED_PLAIN);
intent.putExtra(Constants.EXTRA_RAW_ID, message.getId());
PendingIntent deliveredPI = PendingIntent.getBroadcast(activity, 0, intent, 0);
sms.sendTextMessage(phoneNumber, null, message.getBody(), sentPI, deliveredPI);
Run Code Online (Sandbox Code Playgroud)

然后在Broadcast尝试捕获数据:

@Override
public void onReceive(Context context, Intent intent) {
    String message, prefix = "";
    String action = intent.getAction();
    long id = intent.getLongExtra(Constants.EXTRA_RAW_ID, -1L);  //here I receive id=-1

    // blah-blah.... 
} …
Run Code Online (Sandbox Code Playgroud)

android broadcastreceiver android-intent android-pendingintent

16
推荐指数
2
解决办法
3万
查看次数

Espresso与AsyncTask

我正在尝试为我的SignIn Activity编写测试,其中我正在使用AsyncTask.

public class SignInActivity extends Activity{

@Override
protected void onCreate(Bundle savedInstanceState) {

    .........

    new AsyncSignButton().execute();
}

class AsyncSignButton extends AsyncTask<Void, Void, Integer>{
   ....... 
}
Run Code Online (Sandbox Code Playgroud)

为了测试,我尝试过使用IdlingResource,但我不明白如何将它与AsyncTask一起使用,而不是像示例中那样使用WebView,只是简单的AsyncTask.


这是我的测试代码:

public class Test extends ActivityInstrumentationTestCase2<SplashActivity> {

private SplashActivity mActivity;

public Test(){
    super(SplashActivity.class);
}

public Test(Class<SplashActivity> activityClass) {
    super(activityClass);
}

@Override
protected void setUp() throws Exception{
    super.setUp();
    mActivity = getActivity();
    //how call it?
}

@LargeTest
public void testList() throws InterruptedException {

   //wait AsyncTask before call
   onView(withId(R.id.action_bar_accept_button)).perform(click());

}

public final class AsyncIdlingResource implements IdlingResource { …
Run Code Online (Sandbox Code Playgroud)

android-testing android-espresso

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

Google Play开发者控制台拒绝了我的应用更新

我试图理解并解决为什么我的应用程序被拒绝我知道它是关于SSL的,但我似乎无法找到导致它的依赖项.我正在使用下一个设置:

  1. Android N(24)
  2. 布.
  3. MixPanel.
  4. Quickblox.
  5. Crashlytics
  6. Analytics(分析).

任何帮助,将不胜感激.


更新:这是来自警报部分

安全警报

您的应用程序具有WebViewClient.onReceivedSslError处理程序的不安全实现.具体来说,该实现忽略了所有SSL证书验证错误,使您的应用程序容易受到中间人攻击.攻击者可以使用JavaScript更改受影响的WebView内容,读取传输的数据(例如登录凭据),以及在应用程序内部执行代码.要正确处理SSL证书验证,只要服务器提供的证书符合您的期望,就更改代码以调用SslErrorHandler.proceed(),否则调用SslErrorHandler.cancel().包含受影响的应用和类别的电子邮件警报已发送到您的开发者帐户地址.请尽快解决此漏洞并增加已升级APK的版本号.有关SSL错误处理程序的更多信息,请参阅开发人员帮助中心中的文档.对于其他技术问题,您可以发布到https://www.stackoverflow.com/questions并使用标签"android-security"和"SslErrorHandler."如果您使用的是负责此操作的第三方库,请通知第三方并与他们合作解决问题.要确认您已正确升级,请将更新后的版本上传到开发者控制台,并在五小时后再回来查看.如果应用尚未正确升级,我们将显示警告.请注意,虽然这些特定问题可能不会影响使用WebView SSL的每个应用程序,但最好保持所有安全补丁的最新状态.如果应用程序存在漏洞,导致用户面临泄密风险,则可能会被视为违反了我们的恶意行为政策和开发者分发协议第4.4节.请确保发布的所有应用均符合开发者分发协议和开发者计划政策.如果您有任何疑问或疑虑,请通过Google Play开发者帮助中心与我们的支持小组联系.影响APK版本2.

android google-console-developer android-security sslerrorhandler

7
推荐指数
1
解决办法
2570
查看次数

Android:在后台同步远程数据库的最流畅的方法是什么?

我有一个在Parse托管的Android数据库,我一直在尝试找到最新的方法/做法,用最新的远程更改来更新我的LocalStorage.

我不是要求代码或语法,我只是在寻找一系列要遵循的步骤,我确定我需要使用工作线程,因为我不想阻止用户界面,我很乐意为用户提供尽可能平滑的过渡(他甚至不会意识到更新正在发生)并且我希望它在应用程序位于前台时发生.到目前为止我得到的想法:

  • 使用多线程(Loopers,Handlers,Thread)并在单独的线程中更新每个表.
  • 尝试限制请求以最小化CPU使用率并一次获取一个表.
  • 使用Loader只是听取更改.
  • 调用IntentService也可以逐表获取.
  • 创建未绑定服务,并在关闭应用程序后让数据库更新.
  • 不要在后台更新数据库,并等到用户实际需要数据并检索它.

我已经尝试过IntentService了,它不像我想的那样顺利:

public class DataService extends IntentService {
    public DataService() {
        super(DataService.class.getName());
    }

    @Override
    protected void onHandleIntent(Intent intent) {
        String[] entities = {
                "Img",
                "Pack",
                "Technology",
                "Term",
                "TermHierarchy",
                "TermImplementation",
                "TermTerm",
                "UserTechnology",
                "UserTerm",
        };

        for (String entity : entities) {
            updateLocalTable(entity);
        }
    }

    private void updateLocalTable(String entity) {
        ParseQuery<ParseObject> query = new ParseQuery<ParseObject>(entity);
        query.findInBackground(new FindCallback<ParseObject>() {
            @Override
            public void done(List<ParseObject> objects, ParseException e) {
                if (e == null){
                    ParseObject.pinAllInBackground(objects);
                }else {
                    Log.e(TAG_, e.toString());
                } …
Run Code Online (Sandbox Code Playgroud)

database multithreading android parse-platform

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

如何从自身内部删除片段

在我的应用程序中,我有一个片段实例ActivityFragment,它在addActivity按下按钮 时动态添加。有一个delete_button在每个ActivityFragment和我树立了一个onClickListener的内这个按钮ActivityFragment类。当delete_button按下 时,我想从 onClick 方法内部删除片段。当我创建ActivityFragment对象并将其添加到片段类之外的方法中的活动时,我将如何执行此操作?我应该使用什么领域.remove()

请注意,delete_button应该只删除它所在片段的实例。

这是我MainActivity.javaActivityFragment班级。该addActivity按钮是在底部:

import android.app.Fragment;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.FragmentActivity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends FragmentActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }


    public static class ActivityFragment extends Fragment {
        // @Nullable is used because the method may return …
Run Code Online (Sandbox Code Playgroud)

android android-fragments findviewbyid

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

Android - 什么是处理程序消息?

我在谈论这堂课.

主要文件说明:

定义包含可以发送到处理程序的描述和任意数据对象的消息.此对象包含两个额外的int字段和一个额外的对象字段,允许您在许多情况下不进行分配.

  • 所以我认为它是不同线程之间的某种通信,也许是一种Bundle

  • 主文档中还有一些片段.但我看不出他们是如何建造的以及他们的结构是什么.

  • 为什么要使用它们而不是使用SharedPreferences或者可能是一个Singleton类?测试?


我希望看到一个关于何时以及如何使用它们的小巧紧凑的例子.

java performance multithreading android

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

Android - 应该在哪里调用findViewById?活动还是片段?

我构建会提到,支持多种设备尺寸的应用在这里.

为了处理意见里面Fragment一个可能要么做查找与findViewById在活动的onCreate()或片段的onViewCreated().

他们都会工作,因为:如果你从Activity你那里做到这一点,你将处理Fragment父母的,你的View意志仍然在其中,如果你从中做到Fragment这将有正常的findViewById行为.

所以...

  • 查看查找的最佳位置是什么?
  • 哪一个更快?
  • 哪一个更有效率?

他们都有自己的优势:

如果你这样做Activity:

  • 您可以在托管活动中控制用户交互(例如单击侦听器).
  • 您不需要实现从Activity到Fragment的接口回调.

如果你这样做Fragment:

  • 视图在它们被使用的上下文中被实例化.
  • 片段可以在相同的布局中重用.

这个问题的方式.在他们讨论有关使用getViewgetActivity调用findViewByIdFragment.

接受的答案是:

而不是使用getActivity().findViewById(),你需要getView().findViewById().这样做的原因是,如果您使用活动进行视图查找,那么当具有相同视图ID的多个片段附加到该视图时,您将遇到麻烦

但是,如果你永远不会Fragment在相同的布局中重复使用,那么在查找中这是一个很好的情况Activity吗?


示例布局:

main_activity.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity">

    <fragment
        android:id="@+id/f_main"
        class=".fragments.MainFragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:layout="@layout/fragment_main" /> …
Run Code Online (Sandbox Code Playgroud)

android android-layout android-fragments android-activity

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

从arraylist中删除字符串

如果它不以13开头,我需要从数组列表中删除一个字符串.我已经在数据文件中读取并且每一行都作为字符串读入ArrayList.如果它不以13开头,则需要删除整行.下面显示了读入的数据文件的示例:

13 0 150801 00133990 04 04 1 078 2160 999 1 0 1 0 16 04 07 058 0320 061 0127 068 0546 033 0129 048 0586 042 0133 033
13 0 150801 00140480 04 04 1 086 1730 999 1 0 1 0 13 04 06 047 0309 039 0143 032 0772 017 0131 029 0140 037
13 0 150801 00141320 04 04 1 075 1660 999 1 0 1 0 13 03 06 053 0319 036 0132 …
Run Code Online (Sandbox Code Playgroud)

java string arraylist

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