这太愚蠢了,我确信我会在几分钟内用湿腌鱼刺伤自己.
我有这个方法,其目的是确定assets文件夹中的特定路径是否是子文件夹.它用于递归搜索以查找资产中的文件.
private static boolean isDirectory(AssetManager assetManager, String path) throws IOException
{
// AssetManager.list() returns a string array of assets located @ path
// if path is a file, then the array will be empty and have zero length
// if path does not exist, then an IOException is raised
// (ignore the exception as in theory, this will never happen
// since this is called by the searchAssets recursive find)
// do nothing for uninitialised or empty paths
if …Run Code Online (Sandbox Code Playgroud) 在正常的开发过程中,我注意到特定活动似乎在第二次调用时停止响应.
即 menu->(intent)->activity->(back button)->menu->(intent)
在logcat中没有任何相关内容.
我甚至不知道从哪里开始调试这个也不知道要显示的代码是什么onClick和onResume片段:
if (!dictionary.getClassName().equals("")) {
this.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Intent i;
i = new Intent(mContext, NVGlobeNavigatorVC.class);
i.putExtra("PAGE_TITLE", title);
i.putExtra("TITLE", _dictionary._title);
mContext.startActivity(i);
});
} else {
findViewById(R.id.greaterthan).setVisibility(View.GONE);
}
Run Code Online (Sandbox Code Playgroud)
并在正在启动的活动中:
@Override
protected void onResume() {
super.onResume();
...
Run Code Online (Sandbox Code Playgroud)
清单中没有任何异常:
<activity
android:name=".NVViews.NVGlobeNavigatorVC"
android:theme="@style/WindowTitleBackground"
android:label="GlobeNavigator"/>
Run Code Online (Sandbox Code Playgroud)
为清楚起见,我将断点放在mContext.startActivity(i)和super.onResume().我单击视图,onClickListener并且两个断点都按预期命中.然后按下后退按钮,返回菜单. onPause()按预期调用.
我触摸视图再次启动活动,断点打开startActivity但不在onResume()目标活动中.屏幕变黑,我可以再次走的唯一方法是重启应用程序.如果我暂停调试器,它会暂停,dalvik.system.NativeStart()这意味着活动永远不会重新启动.
我不认为它是相关的,但我正在使用Intellij IDEA并删除了所有输出目录,使缓存无效并完成了完全重建.
目标API是8.我已经在2.3和4.0.4上测试过.
有任何想法吗?我很难过.
[编辑]
在onPause,我将一些东西保存到prefs.目的onResume()是让他们再次回来:
@Override
protected …Run Code Online (Sandbox Code Playgroud) 我有以下Preference类:
public class AppPreferencesActivity extends PreferenceActivity {
private SharedPreferences appPrefs;
private SharedPreferences.Editor prefEditor;
private Mediator mediator;
private SharedPreferences.OnSharedPreferenceChangeListener listener;
private User user;
@SuppressWarnings("deprecation")
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//---load the preferences from an XML file---
addPreferencesFromResource(R.xml.preferences);
this.appPrefs = PreferenceManager.getDefaultSharedPreferences(this);
this.mediator = (Mediator) getApplication();
this.prefEditor = appPrefs.edit();
this.user = mediator.getUser();
setPreferences();
listener = new SharedPreferences.OnSharedPreferenceChangeListener() {
public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
// Implementation
updatePreference(key);
Toast.makeText(AppPreferencesActivity.this,
"Information updated",
Toast.LENGTH_SHORT).show();
}
};
appPrefs.registerOnSharedPreferenceChangeListener(listener);
}
private void setPreferences(){
prefEditor.putString("nameEdit", user.getName() + …Run Code Online (Sandbox Code Playgroud) 我正在寻找几个小时来找出为什么在共享首选项中保存布尔列表不起作用.
方法不保存或加载某些东西...... loadmethod总是返回替代值:所以list_size为0,布尔值为false.
首先,我在MainActivity中创建列表并调用save方法:
SaveLoadTraining sLoad = new SaveLoadTraining();
ArrayList<Boolean> listBoolTrain = new ArrayList<Boolean>();
listBoolTrain.add(true);
listBoolTrain.add(true);
sLoad.saveArray(listBoolTrain);
Run Code Online (Sandbox Code Playgroud)
子类SaveLoadTraining看起来像这样:
package de.sebspr.app08.halle;
import java.util.ArrayList;
import android.content.Context;
import android.content.SharedPreferences;
import de.sebspr.app08.MainActivity;
public class SaveLoadTraining {
private Context context;
public static final String PREFS_NAME = "ListFile";
private ArrayList<Boolean> list;
public SaveLoadTraining(){
this.context = MainActivity.getMContext();
}
public void saveArray(ArrayList<Boolean> list){
this.list = list;
SharedPreferences settings = context.getSharedPreferences(PREFS_NAME, 0);
SharedPreferences.Editor editor = settings.edit();
int size = list.size();
editor.putInt("list_size", size);
for (int i = 0; i < …Run Code Online (Sandbox Code Playgroud) 我正在尝试将图像添加到相机surfaceview并尝试使用以下代码获取该图像.
else if(v.equals(findViewById(R.id.ok_button))){
// saveImage();
topbar.setVisibility(View.GONE);
menubar.setVisibility(View.GONE);
bottom.setVisibility(View.GONE);
View s = ml.getRootView();
s.setDrawingCacheEnabled(true);
Bitmap b = s.getDrawingCache();
Bitmap watermarkimage=b;
s.setVisibility(View.GONE);
Log.e("ok","ok");
Intent i=new Intent(CameraActivity.this,Update.class);
i.putExtra("data",watermarkimage);
startActivity(i);
finish();
}
Run Code Online (Sandbox Code Playgroud)
我保存了整个活动以获取图像.通过使用以下代码,我得到了位图
View s = ml.getRootView();
s.setDrawingCacheEnabled(true);
Bitmap b = s.getDrawingCache();
Run Code Online (Sandbox Code Playgroud)
当我尝试将此位图发送到另一个活动时,我收到此错误
12-05 17:58:38.700: E/AndroidRuntime(10590): FATAL EXCEPTION: main
12-05 17:58:38.700: E/AndroidRuntime(10590): java.lang.IllegalStateException: Can't parcel a recycled bitmap
12-05 17:58:38.700: E/AndroidRuntime(10590): at android.graphics.Bitmap.checkRecycled(Bitmap.java:210)
12-05 17:58:38.700: E/AndroidRuntime(10590): at android.graphics.Bitmap.writeToParcel(Bitmap.java:960)
12-05 17:58:38.700: E/AndroidRuntime(10590): at android.os.Parcel.writeParcelable(Parcel.java:1151)
12-05 17:58:38.700: E/AndroidRuntime(10590): at android.os.Parcel.writeValue(Parcel.java:1070)
12-05 17:58:38.700: E/AndroidRuntime(10590): at android.os.Parcel.writeMapInternal(Parcel.java:488)
12-05 …Run Code Online (Sandbox Code Playgroud) 我在onDraw()中有这个代码.
radius = drawGmpImage(this.gmpImage, canvas);
canvas.drawCircle(kHorizontalOffset, kScreenVerticalOffset, radius , maskPaint);
Run Code Online (Sandbox Code Playgroud)
drawGmpImage创建一个复杂的图形,这个图形上绘有许多线条.这是一个我无法改变的库函数.线条是多边形,可以延伸到圆的圆周之外.
需要的是"清空"在圆圈外面绘制的所有内容.
这是来自iOS的端口,原始开发人员解决方案是使用一个简单的位图掩码,存储为资源,其透明圆圈与绘制的圆的大小相匹配.简单地在绘制的圆上绘制位图具有所需的效果,但在Android上不是一个选项,因为我需要支持所有可能的分辨率和比率.
因此,canvas.drawCircle()调用是我尝试掩盖圆圈外的所有内容的开始.它工作得很好,因为在我绘制的圆上绘制一个实心圆,这样剩下的唯一东西就是绘制圆周外的多边形线.半径是绘制圆的半径.
如何将其反转,以便留下圆圈的内容?
我在onDraw()方法的调用堆栈中有一个3级的方法.它被称为数百次,有时每次重绘数千次.我已经对onDraw()方法进行了大量的分析,我可以看到以下方法占总数的14%,所以绝对值得一看.我需要在压缩缩放和拖动操作期间提高帧速率.
private void getVisiblePointsFromPath(){
double longRads = longitude * (Math.PI / 180);
double latRads = latitude * (Math.PI / 180);
...
}
Run Code Online (Sandbox Code Playgroud)
当方法退出并且双精度超出范围时,我认为它们符合GC的条件,尽管我知道这可能发生的时间是非确定性的.
这样做有什么好处:
public class GisView extends ImageView{
private double longRads;
private double latRads;
private void getVisiblePointsFromPath(){
longRads = longitude * (Math.PI / 180);
latRads = latitude * (Math.PI / 180);
...
}
}
Run Code Online (Sandbox Code Playgroud)
我假设这个习惯用法会导致双打被取消,然后在每次传递时重新分配,但不会导致额外的垃圾,从而减少我造成的GC数量.或者VM比那更聪明?
请注意,我的问题本身并不是"哪个更快",而是关于哪个可能导致GC减少.我可以测量速度差异,但我不太了解Dalvik VM和Android GC来预测哪个导致更少的垃圾.
这只是一个知识/好奇心问题.
在Java工作了几年之后,这才刚刚打动了我.
class Foo {
class Bar{
Foo.this.doSomething();
}
}
Run Code Online (Sandbox Code Playgroud)
当我看到时Foo.this,我会认为它是一个静态参考,显然不是这种情况.
我知道这是Java规范的一部分,但确切地说,当你使用它时会发生什么<Class>.this?
这是"它只是"的东西之一吗?
我有一个复杂的框架布局包含几个自定义视图.主视图是图表.
覆盖图形是一个自定义视图,它表示用户可以在图形周围拖动以读取有关特定数据点的详细信息的十字线指针.
框架布局捕获所有触摸事件,在其每个子视图上调用"命中测试"方法,以确定触摸是否在该视图上,然后将触摸事件调度到适当的视图.
当用户触摸十字线并拖动它时,我将触摸事件传递给它用来更新它的位置并使其自身无效的十字线.
一切正常,除了......
当我使任何这些子视图无效时,布局中的所有视图都会重绘.我知道这一点,因为我在开发者选项中打开了"show screen updates".在任何时候我都不会使包含的FrameLayout无效 - 或者至少,不是故意的.
当然,处理布局的Activity不会使它失效,并且我在子视图中没有对父级的任何引用.
我没有发布代码,因为a)我不知道这可能是正常的行为,b)有很多它!c)如果这不是正常行为,我不知道代码的哪一部分存在问题.当然,我很乐意提供任何可能要求的东西.
我的最小API是2.3.3,我的目标是4.0.这两个版本都会发生这种情况,所以我怀疑我的代码是问题,但从哪里开始?
有关可能发生的事情的任何线索?
我开发应用程序以将动态数据添加到多个表视图.结构如下.
我在onPostExecute中的代码是:
protected void onPostExecute(List<String> results){
int ind,i = 0;
ScrollView sv=null;
TableLayout tl=null;
TableRow tr = null;
int mjsonlength=results.size();
if(results!=null){
TableLayout indextl=(TableLayout)findViewById(R.id.indextablelayout);
TableRow indextr=new TableRow(SubProducts.this);
//indext1.moveToFirst();
LinearLayout llt=(LinearLayout)findViewById(R.id.alltablell);
//for(int f=0;f<mjsonlength;f++){
for( ind=0;ind<indextitle.size();ind++)
{
TextView indextv=new TextView(SubProducts.this);
indextv.setBackgroundResource(R.drawable.greenbg);
indextv.setHeight(25);
indextv.setWidth(50);
indextv.setId(6);
indextv.setTextColor(Color.WHITE);
indextv.setText(indextitle.get(ind));
indextv.setPadding(20,10,6,3);
indextr.addView(indextv);
indextl.addView(indextr,6);
sv=new ScrollView(SubProducts.this);
tl=new TableLayout(SubProducts.this);
for( i=0;i<mjsonlength;i++){
tr=new TableRow(SubProducts.this);
if(ind==i) {
RelativeLayout rl=new RelativeLayout(SubProducts.this);
Resources res = getResources(); //resource handle
rl.setBackgroundResource(R.drawable.prd_box);
RelativeLayout.LayoutParams newParams1 = new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.WRAP_CONTENT,
RelativeLayout.LayoutParams.WRAP_CONTENT);
image=new ImageView(SubProducts.this);
image.setLayoutParams(newParams1);
image.setId(1);
image.setImageBitmap(bmp);
image.setPadding(5, 20, …Run Code Online (Sandbox Code Playgroud)