首先,感谢您对这个伟大的网站,我通过搜索这里回答的问题找到了大量的信息.但是我有一个问题,我只发现了一个(没有答案).
我正在编写一个应用程序,它使用AudioTrack通过耳机插孔循环运行时生成的正弦波(以控制其他电子设备).它以定时间隔(使用Handler.postDelayed)执行此操作,并且它工作正常 - 除非您碰巧强制关闭应用程序.在这种情况下,即使在应用程序本身已经过去之后,正弦波仍在继续播放,而字面上我唯一能做的就是重启手机.
如果应用程序正确关闭,即使它崩溃,声音就会停止.
我试过了:
我知道在Android上使用任务杀手并不"健康",但很多人仍然这样做,而且我不希望我的用户的手机变成不可阻挡的噪音发生器,以防我的应用程序碰巧挂起并让它的屁股发出声响.
以下是生成正弦波的代码:
int bufSize = (int)(11025.0 / 60.0); // the number of samples needed for a seamless loop at 60Hz
AT = new AudioTrack(AudioManager.STREAM_MUSIC, 11025, AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_8BIT, bufSize, AudioTrack.MODE_STATIC);
byte buffer[] = new byte[bufSize];
float angle = 0.0f;
for (int i=0; i < bufSize; i++){
buffer[i] = (byte)(Math.sin(angle) * 255);
angle += (float)(2*Math.PI) * 60 / 11025;
}
if (AT.write(buffer, 0, bufSize) != bufSize){ …Run Code Online (Sandbox Code Playgroud) 我想实现以下目标:

它适用于以下布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<LinearLayout
android:layout_weight="3"
android:layout_width="0dp"
android:layout_height="fill_parent"
android:orientation="vertical" >
<fragment
android:name="com.bobjohn.DetailsMenuFragment"
android:id="@+id/detailsMenuFragment"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="6"
/>
<fragment
android:name="com.bobjohn.SummaryFragment"
android:id="@+id/summaryFragment"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_margin="10dp"
android:layout_weight="4"/>
</LinearLayout>
<TextView
android:layout_width="0dp"
android:layout_weight="7"
android:layout_height="fill_parent"
android:text="Test Text"/>
</LinearLayout>
Run Code Online (Sandbox Code Playgroud)
但是,我收到有关嵌套权重对性能不利的警告.我理解错误,但我不知道如何以另一种方式表达这种布局.有什么选择?
我正在使用以下代码来显示TimePickerDialog:
TimePickerDialog dialog = new TimePickerDialog(this, new OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
System.out.println("onTimeSet");
}
}, 20, 15, true);
dialog.setTitle("Test");
dialog.setButton(TimePickerDialog.BUTTON_POSITIVE, "Done", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
System.out.println("Done");
}
});
dialog.setButton(TimePickerDialog.BUTTON_NEGATIVE, "Cancel", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
System.out.println("Cancel");
}
});
dialog.show();
Run Code Online (Sandbox Code Playgroud)
在运行Android 2.3.7的设备上,onTimeSet不会调用该onClick方法(方法可以).在运行4.2.2的设备上,onTimeSet确实会调用它.
这里发生了什么?
我正在尝试向我的Cloud Endpoints添加身份验证,但我无法让它工作.我正在使用此博客作为指南:http://devthots.blogspot.nl/2012/07/building-awesome-android-apps-with.html
是)我有的:
在AppEngine项目中:
@Api(name = "noteendpoint", clientIds = { "123456789012-abcdefghijklmnopqrstuvwxyz012345.apps.googleusercontent.com" }, audiences = { "my_project_id.appspot.com" }, namespace = @ApiNamespace(ownerDomain = "example.com", ownerName = "example.com", packagePath = "myapp"))
public class NoteEndpoint {
// Rest of class, added parameter User to all methods.
}
Run Code Online (Sandbox Code Playgroud)
在我的Android应用项目中:
Note note = new Note();
note.setDescription("Description!");
GoogleAccountCredential credential =
GoogleAccountCredential.usingAudience(MainActivity.this, "my_project_id.appspot.com");
credential.setSelectedAccountName(ACCOUNT_NAME);
note.setEmailAddress(credential.getSelectedAccountName());
Builder endpointBuilder = new Noteendpoint.Builder(
AndroidHttp.newCompatibleTransport(),
new JacksonFactory(), credential);
Noteendpoint endpoint = CloudEndpointUtils.updateBuilder(endpointBuilder).build();
Note result = endpoint.insertNote(note).execute(); // Exception thrown …Run Code Online (Sandbox Code Playgroud) 我正在使用Square的Retrofit Client从Android应用程序发出简单的请求.像这样:
RestAdapter restAdapter = new RestAdapter.Builder()
.setServer(Configurations.getInstance().plistMap.get("PTBaseURL"))
.setRequestHeaders(new RequestHeaders() {
@Override
public List<Header> get() {
List<Header> headers = new ArrayList<Header>();
Header authHeader = new Header("Authorization", authType + " " + UserManager.getInstance().currentUser.token);
headers.add(authHeader);
}
return headers;
}
})
.build();
this.service = restAdapter.create(ClientInterface.class);
Run Code Online (Sandbox Code Playgroud)
一个端点重定向到不同的URL(s3).由于对此问题不重要的原因,重定向请求失败,因此我的callback.failure(error)方法被调用.我需要能够在某些时候访问和修改重定向URL或请求,最好是在callback.failure().我怎样才能做到这一点?
或者,有没有办法设置类似的东西followRedirects = false(并以这种方式拦截重定向)?
我正在尝试使用Transitions API为两个ViewGroup之间的共享元素设置动画.目标是绿色视图从"父母的边界"向"新位置"移动.
我有以下布局:
first.xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:layout_width="200dp"
android:layout_height="200dp"
android:background="#f00" />
<FrameLayout
android:layout_width="200dp"
android:layout_height="200dp"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:background="#00f">
<View
android:id="@+id/myview"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_gravity="center"
android:background="#0f0" />
</FrameLayout>
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)
second.xml:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<FrameLayout
android:layout_width="200dp"
android:layout_height="200dp"
android:background="#f00">
<View
android:id="@+id/myview"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_gravity="center"
android:background="#0f0" />
</FrameLayout>
<FrameLayout
android:layout_width="200dp"
android:layout_height="200dp"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:background="#00f" />
</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)
但是,我无法让它正常工作.默认转换只是淡出所有内容,ChangeBounds转换什么都不做,而且ChangeTransform看起来也不正确.
我正在使用的代码:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final ViewGroup root = (ViewGroup) findViewById(android.R.id.content);
setContentView(R.layout.first);
View myView1 = findViewById(R.id.myview);
myView1.setTransitionName("MYVIEW");
new …Run Code Online (Sandbox Code Playgroud) 我正在尝试启动模拟器,但我不断收到错误Failed to allocate memory: 8.
有一些解决这个问题的方法,将RAM设置为1024到512,但是当我将它设置为8时,它仍然会因此错误而崩溃!
我该怎么办?
设置屏幕截图:

这里给出了崩溃的模拟器arm.exe的错误消息:
Problem signature:
Problem Event Name: APPCRASH
Application Name: emulator-arm.exe
Application Version: 0.0.0.0
Application Timestamp: 4fe779fb
Fault Module Name: emulator-arm.exe
Fault Module Version: 0.0.0.0
Fault Module Timestamp: 4fe779fb
Exception Code: 40000015
Exception Offset: 0014428e
OS Version: 6.1.7600.2.0.0.768.3
Locale ID: 1043
Additional Information 1: ea2b
Additional Information 2: ea2b4716fbf9f89aacc15214fb1537bb
Additional Information 3: 8d2f
Additional Information 4: 8d2f162ccf8522e475fc4fbe036a6efa
Run Code Online (Sandbox Code Playgroud)
我最后一次检查和模拟器工作是在更新到ADT 20之前和删除所有旧的AVD之前.
我正在尝试创建一个标准尺寸为4x2图块的appwidget.目前,我正在使用这些值:
android:minHeight="146dp"
android:minWidth="294dp"
Run Code Online (Sandbox Code Playgroud)
在我的欲望运行姜饼,小部件显示为4x2.
在运行ICS的华硕TF101平板电脑上,小部件的大小为4x2.
最后,在运行ICS的模拟器720x1280中,窗口小部件的大小为4x3.
所以我在这里有点困惑.在所有设备上实现4x2小部件的正确值(可能使用不同的资源文件夹)是什么?
我发现文章"避免内存泄漏",据说下面的代码:
private static Drawable sBackground;
@Override
protected void onCreate(Bundle state) {
super.onCreate(state);
TextView label = new TextView(this);
label.setText("Leaks are bad");
if (sBackground == null) {
sBackground = getDrawable(R.drawable.large_bitmap);
}
label.setBackgroundDrawable(sBackground);
setContentView(label);
}
Run Code Online (Sandbox Code Playgroud)
不是一个好主意,因为:
当屏幕方向改变时,系统默认会破坏当前活动并创建新活动,同时保留其状态.这样,Android将从资源重新加载应用程序的UI.
那么上面的代码:
...泄漏第一次屏幕方向更改时创建的第一个活动.将Drawable附加到视图时,视图将设置为drawable上的回调.在上面的代码片段中,这意味着drawable具有对TextView的引用,TextView本身具有对活动(Context)的引用,而Activity又引用了几乎所有内容(取决于您的代码).
但是,当屏幕方向改变时,调用方法setBackgroundDrawable(Drawable background),然后调用:
background.setCallback(this);
Run Code Online (Sandbox Code Playgroud)
该方法Drawable.setCallback()以下列方式定义:
public final void setCallback(Callback cb) {
mCallback = new WeakReference<Callback>(cb);
}
Run Code Online (Sandbox Code Playgroud)
因此,现在后台应该释放对前一个TextView的旧引用,并且应该创建对新TextView的新引用.
因此,似乎更改屏幕方向只会泄漏参考,直到新创建活动.
我哪里错了?
我有以下结构:
build.gradle
src
- main
- AndroidManifest.xml
- kotlin
- pkg
- MyClass.kt (internal class MyClass)
- test
- kotlin
- pkg
- MyClassTest.kt
Run Code Online (Sandbox Code Playgroud)
在MyClassTest.kt我参考internal class MyClass.
的build.gradle:
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
//apply plugin: 'java'
//apply plugin: 'kotlin'
android {
compileSdkVersion 23
buildToolsVersion "23.0.2"
sourceSets {
main.java.srcDirs += 'src/main/kotlin'
test.java.srcDirs += 'src/test/kotlin'
}
}
dependencies {
testCompile 'junit:junit:4.12'
compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
}
buildscript {
ext.kotlin_version = '1.0.0-beta-2423'
repositories {
mavenCentral()
}
dependencies { …Run Code Online (Sandbox Code Playgroud) android ×10
java ×2
android-view ×1
audio ×1
kotlin ×1
memory-leaks ×1
networking ×1
retrofit ×1
taskkill ×1