我有一个可穿戴设备,我正在尝试连接到GoogleApiClient,但从不调用回调(onConnected,onConnectionSuspended或onConnectionFailed).其他所有工作正常,DataLayerListenerService能够从掌上电脑接收消息,并在连接时调用onPeerConnected.我试过了仿真器和三星Gear Live设备.这是我在Activity中的代码,我正在尝试连接到GoogleApiClient.
public class WearReaderActivity extends Activity implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {
public static final String CONTENT_EXTRA = "contentExtra";
private String LOG_TAG = WearReaderActivity.class.getSimpleName();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.reader);
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addApi(Wearable.API)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.build();
}
private GoogleApiClient mGoogleApiClient;
@Override
protected void onStart() {
super.onStart();
Log.e("Connected?", String.valueOf(mGoogleApiClient.isConnected()));
//new Thread(new GetContent()).start();
}
@Override
public void onConnected(Bundle bundle) {
Log.d("Connected", "Connected");
new Thread(new GetContent()).start();
}
@Override
public void onConnectionSuspended(int i) {
Log.d("Connection suspened", "Connection suspended");
}
@Override
public …Run Code Online (Sandbox Code Playgroud) 我问,因为我试图使用一个模拟框架(Mockito),它不允许你模拟静态方法.调查一下我发现有不少博客文章说你应该尽可能少的静态方法,但是我很难理解为什么.特别是为什么不修改全局状态的方法基本上是辅助方法.例如,我有一个名为ApiCaller有几个静态方法的类.静态方法的一个目的是执行HTTP调用,处理我们的服务器可能返回的任何自定义问题(例如用户未登录)并返回响应.为了简化,例如:
public class ApiCaller {
...
public static String makeHttpCall(Url url) {
// Performs logic to retrieve response and deal with custom server errors
...
return response;
}
}
Run Code Online (Sandbox Code Playgroud)
要使用这一切,我所要做的就是调用ApiCaller.makeHttpCall(url)
Now我可以很容易地将它变为非静态方法,如:
public class ApiCaller {
...
public String makeHttpCall(Url url) {
// Performs logic to retrieve response and deal with custom server errors
...
return response;
}
}
Run Code Online (Sandbox Code Playgroud)
然后使用此方法调用,new ApiCaller().makeHttpCall()但这似乎是额外的开销.任何人都可以解释为什么这是坏的,如果有一个更好的解决方案使方法非静态(除了删除关键字),以便我可以使用模拟框架存根这些方法?
谢谢!
我正在尝试通过Android手机安装可穿戴应用程序,使用此处找到的"使用Android Studio方法打包" ,但它无效.apk永远不会安装到可穿戴设备上.这是logcat输出:
07-28 15:11:54.107 766-820/? W/PackageManager? Unknown permission com.google.android.wearable.READ_SETTINGS in package com.google.android.gms
07-28 15:11:54.117 766-820/? W/PackageManager? Not granting permission com.google.android.gm.permission.AUTO_SEND to package com.google.android.wearable.app (protectionLevel=2 flags=0x88be44)
07-28 15:11:54.117 766-820/? W/PackageManager? Not granting permission android.permission.MEDIA_CONTENT_CONTROL to package com.google.android.wearable.app (protectionLevel=18 flags=0x88be44)
07-28 15:11:55.047 632-632/? D/WearablePkgInstaller? Got PackageUpdateReceiver message Intent { act=android.intent.action.PACKAGE_REMOVED dat=package:my.package.name flg=0x4000010 cmp=com.google.android.wearable.app/com.google.android.clockwork.companion.packagemanager.PackageUpdateReceiver (has extras) }
07-28 15:11:55.177 632-632/? D/WearablePkgInstaller? Got PackageUpdateReceiver message Intent { act=android.intent.action.PACKAGE_ADDED dat=package:my.package.name flg=0x4000010 cmp=com.google.android.wearable.app/com.google.android.clockwork.companion.packagemanager.PackageUpdateReceiver (has extras) }
Run Code Online (Sandbox Code Playgroud)
作为旁注,我能够手动打包(也在上面的链接中描述),当我在手机上运行时,apk安装在可穿戴设备上.我正在使用buildToolsVersion 20.0.0,我正在运行Android Studio 0.8.2并且在我的手机模块的build.gradle中有这一行:
wearApp project(':wearable') …Run Code Online (Sandbox Code Playgroud) 我有一个相当简单的xml文件,里面有一个图像按钮.图形布局xml设计器上的图像显示正常,当我运行开发版本时显示正常,但是一旦我创建了签名的apk文件并运行它,图像就不再显示了.这只是一个空按钮.我想不出有什么理由,有什么想法吗?xml文件如下所示:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/navigation_root"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<TextView
android:id="@+id/navigation_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="5dp"
android:text="TextView"
android:textAppearance="?android:attr/textAppearanceLarge" >
</TextView>
<SeekBar
android:id="@+id/navigation_seekbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:padding="5dp" >
</SeekBar>
<LinearLayout
android:id="@+id/linearLayout1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="5dp" >
<ImageButton
android:id="@+id/part_select_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/chapter_select" >
</ImageButton>
<Button
android:id="@+id/navigation_ok_button"
android:layout_width="75dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="@string/ok" >
</Button>
<Button
android:id="@+id/navigation_cancel_button"
android:layout_width="75dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="@string/cancel" >
</Button>
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
该图像@drawable/chapter_select是一个相当小(41*41)的png文件,位于res/drawable文件夹中.
我有一个简单的线性布局,我想根据设备的屏幕尺寸进行更改.我想要做的就像是
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="@string/cover_orientation"
android:layout_width="fill_parent"
android:layout_height="fill_parent"/>
Run Code Online (Sandbox Code Playgroud)
我在values和values-xlarge下创建了不同的dimen.xml文件,这样cover_orientation变量将根据屏幕大小采用不同的值("vertical"或"horizontal").
string name="cover_orientation">"vertical"
Run Code Online (Sandbox Code Playgroud)
但这不起作用.我找到了一个临时工作,包括检查屏幕大小和手动更改方向:
if(getResources().getString(R.string.screen_size) == "xlarge"){
((LinearLayout)convertView).setOrientation(1);
}
Run Code Online (Sandbox Code Playgroud)
但似乎你应该能够以第一种方式做到这一点(更优雅/更少的代码).
我认为每种屏幕尺寸都有不同的布局,但布局实际上非常大,这是我对不同屏幕尺寸所需的唯一改变.因此复制整个布局对我来说没有多大意义.
谢谢!
我是Android测试的新手,我正在尝试使用MockContext创建一个ApplicationTestCase(实际上我正在尝试使用重命名模拟上下文).但我不断收到AssertionFailedError.到目前为止,这是我的基本代码:
AppTests.java
package com.myProject.test;
import android.test.ApplicationTestCase;
public class AppTests extends ApplicationTestCase<MyApplication> {
public AppTests() {
super(MyApplication.class);
}
@Override
protected void setUp() throws Exception {
final RenamingMockContext mockContext = new RenamingMockContext(getContext());
setContext(mockContext);
createApplication();
}
}
Run Code Online (Sandbox Code Playgroud)
MyApplication.java
package com.myProject.test;
import android.app.Application;
public class MyApplication extends Application {
public MyApplication() {
}
@Override
public void onCreate() {
super.onCreate();
}
}
Run Code Online (Sandbox Code Playgroud)
RenamingMockContext.java
package com.myProject.test;
import android.content.Context;
import android.content.SharedPreferences;
import android.test.RenamingDelegatingContext;
import android.test.mock.MockContext;
public class RenamingMockContext extends RenamingDelegatingContext {
private static final String PREFIX = …Run Code Online (Sandbox Code Playgroud) 我们长期以来一直在努力应对65k方法限制,并且已经完成了大部分优化工作.现在我正在尝试添加Jacoco插件,我再次得到dex限制错误:
Error:Execution failed for task ‘:MyProject:dexExternalBetaDebug'.
> com.android.ide.common.internal.LoggedErrorException: Failed to run command:
/Users/orrieshannon/Code/sdk/sdk/build-tools/21.1.1/dx --dex --no-optimize --output /Me/MyProject/build/intermediates/dex/externalBeta/debug --input-list=/Me/MyProject/build/intermediates/tmp/dex/externalBeta/debug/inputList.txt
Error Code:
2
Output:
objc[80218]: Class JavaLaunchHelper is implemented in both /Library/Java/JavaVirtualMachines/jdk1.7.0_67.jdk/Contents/Home/bin/java and /Library/Java/JavaVirtualMachines/jdk1.7.0_67.jdk/Contents/Home/jre/lib/libinstrument.dylib. One of the two will be used. Which one is undefined.
UNEXPECTED TOP-LEVEL EXCEPTION:
com.android.dex.DexIndexOverflowException: Cannot merge new index 66105 into a non-jumbo instruction!
at com.android.dx.merge.InstructionTransformer.jumboCheck(InstructionTransformer.java:109)
at com.android.dx.merge.InstructionTransformer.access$800(InstructionTransformer.java:26)
at com.android.dx.merge.InstructionTransformer$StringVisitor.visit(InstructionTransformer.java:72)
at com.android.dx.io.CodeReader.callVisit(CodeReader.java:114)
at com.android.dx.io.CodeReader.visitAll(CodeReader.java:89)
at com.android.dx.merge.InstructionTransformer.transform(InstructionTransformer.java:49)
at com.android.dx.merge.DexMerger.transformCode(DexMerger.java:842)
at com.android.dx.merge.DexMerger.transformMethods(DexMerger.java:813)
at com.android.dx.merge.DexMerger.transformClassData(DexMerger.java:786)
at com.android.dx.merge.DexMerger.transformClassDef(DexMerger.java:682)
at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:542)
at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:171) …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用android.R.drawable stat_sys_download作为文本视图的背景图像,但它没有显示:
textview.setBackgroundDrawable(getResources().getDrawable(android.R.drawable.stat_sys_download));
Run Code Online (Sandbox Code Playgroud)
如果我使用像ic_menu_save这样的不同android.R.drawable它可以正常工作:
textview.setBackgroundDrawable(getResources().getDrawable(android.R.drawable.ic_menu_save));
Run Code Online (Sandbox Code Playgroud)
但是我可以使用stat_sys_download作为菜单选项上的图标,所以我知道它存在:
menu.add(0, OPTION_MENU_SORTBY, 0, Str.TEXT_SORTBY).setIcon(android.R.drawable.stat_sys_download);
Run Code Online (Sandbox Code Playgroud)
那么为什么我可以将stat_sys_download用作图标而不是背景?我应该将它复制到我的资源文件夹并以这种方式使用它吗?
概述:在onStart和异步任务中打开数据库连接已变得非常复杂.拥有全局可用的数据库连接是不好的做法吗?如果它是坏的什么是更好的方法?
详细信息:我有一个应用程序在几个活动中连接到sqlite3数据库.起初,我需要访问数据库的地方不多,所以每次需要访问时我都只是打开和关闭.然后有更多地方需要访问它,正如另一个Stack Overflow问题所示,我开始在需要连接的活动的onStart方法中打开数据库连接,并在onStop方法中关闭它.
这工作正常,直到我开始需要连接一些超出活动的异步任务.由于已调用活动的onStop方法并且已关闭连接,因此当异步任务尝试访问数据库时,它失败了.作为一种解决方案,我为每个异步任务创建了单独的连接,这些连接在onPreExecute方法中打开并在onPostExecute方法中关闭.
这导致了许多连接的打开和关闭,我想知道在应用程序上下文中创建全局可用的数据库连接是否是一个好主意.如果我忘记关闭连接或应用程序遇到强制关闭,它肯定会清理大量代码并删除正在发生的任何未关闭的数据库异常.其他人试过这个/看到这种方法的任何问题?
在我看到的有限例子之外,我很难绕过如何使用Dagger 2.0.我们来看一个阅读应用程序的例子.在这个阅读应用程序中,有一个用户的故事库和登录的能力.为了这个例子,感兴趣的类是:
MainApplication.java - 扩展申请
LibraryManager.java - 经理,负责在用户的库中添加/删除故事.这是从MainApplication
AccountManager.java - 经理负责保存所有用户的登录信息.它可以从LibraryManager中调用
我仍然试图围绕我应该创建的组件和模块.这是我到目前为止可以收集的内容:
创建一个HelperModule提供AccountManager和LibraryManager实例:
@Module
public class HelperModule {
@Provides
@Singleton
AccountManager provideAccountManager() {
return new AccountManager();
}
@Provides
@Singleton
LibraryManager provideLibraryManager() {
return new LibraryManager();
}
}
Run Code Online (Sandbox Code Playgroud)
创建一个MainApplicationComponent列出HelperModule其模块列表:
@Singleton
@Component(modules = {AppModule.class, HelperModule.class})
public interface MainApplicationComponent {
MainApplication injectApplication(MainApplication application);
}
Run Code Online (Sandbox Code Playgroud)
包含@Injects LibraryManager libraryManager在MainApplication应用程序中并将应用程序注入图形中.最后,它查询注入LibraryManager的库中的故事数:
public class MainApplication extends Application {
@Inject LibraryManager libraryManager; …Run Code Online (Sandbox Code Playgroud) 当我尝试在Android工作室中"检查更新"时,我收到以下消息:
"你已经安装了最新版本的Android Studio(预览版)."
我在0.5.2,这里列出的最新版本http://tools.android.com/download/studio/canary/latest是0.5.4.检查更新时,我选择了金丝雀构建.有任何想法吗?