小编Ben*_*fez的帖子

无论操作系统如何,在Java中执行计划任务的最佳解决方案是什么?

我想在我的Java桌面应用程序上生成警报:

  • 警报设置的具体日期/时间可以是5分钟或5个月
  • 我需要能够在触发警报时创建SWT应用程序
  • 我需要这个能够在任何操作系统上工作.软件用户可能拥有Windows(其中90%),其余Mac OS(包括我)
  • 软件许可证必须允许我在商业程序中使用它,而不需要开源它(因此,没有GPL)
  • 我不能要求用户安装Cygwin,因此实现需要是Windows和Unix的原生

我正在使用Java,Eclipse,SWT进行开发,我的应用程序是使用Java Web Start从我的服务器部署的.我正在使用Mac OS X.6进行开发.


我想我有几个选择:

  1. 在启动时运行我的应用程序,并自己处理一切;
  2. 使用系统服务.
  3. 在Unix上使用cron表,在Windows上使用Scheduled Tasks

在启动时运行

我真的不喜欢这个解决方案,我希望有更优雅的东西.
参考:我想在Mac OS/Windows上的System Startup上运行我的Java程序.我怎样才能做到这一点?

系统服务

如果我将它作为系统服务运行,我可以从中受益,因为操作系统将确保我的软件:

  • 一直在运行
  • 没有/需要GUI
  • 失败后重新启动

我研究了一些我可以使用的资源:

  • run4j - CPL - 仅在Windows上运行,似乎是一个有效的候选者
  • jsvc - Apache 2.0 - 仅限Unix,似乎是一个有效的候选者
  • Java Service Wrapper - 各种 - 我买不起付费许可证,免费的是GPL.因此,我不想/不能使用它

我在系统服务选项中的问题是:

  1. 还有其他选择吗?
  2. 我的计划实施是否正确:

    • 在应用程序启动时,检查服务是否存在
    • 如果没有安装:
      • 升级用户以安装服务(Unix上的root,Windows上的UAC)
      • 如果主机操作系统是Windows,请使用run4j注册该服务
      • 如果主机操作系统是Unix,请使用jsvc注册该服务
    • 如果它没有运行,请启动它

因此,在第一次运行时,应用程序将安装该服务并启动它.当应用程序关闭时,服务仍在运行,并且不再需要应用程序,除非它未注册.
但是,我想我仍然会错过"启动时运行"功能.

我对吗?我错过了什么吗?

cron /任务计划程序

在Unix上,我可以轻松使用cron表而无需应用程序将用户升级为root.我不需要处理重启,系统日期更改等.看起来不错.

在Windows上,我可以使用任务计划程序,即使在使用AtSchTasks的命令行中也是如此.这看起来不错,但是我需要这个兼容从XP到7,我不能轻易测试这个.


那你会怎么做?我错过了什么?您有什么建议可以帮助我选择最好,最优雅的解决方案吗?

java cron service scheduled-tasks

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

为什么Android在我的SpinnerAdapter中回收错误的视图类型?

我正在尝试制作一个具有分隔符的ActionBar微调器.我实现了一个SpinnerAdapter有2个项目视图类型(感谢getViewTypeCount).问题是我convertViews从另一种类型发送了一些.

这是我的SpinnerAdapter:

public abstract class SeparatorSpinnerAdapter implements SpinnerAdapter {
    Context mContext;
    List<Object> mData;
    int mSeparatorLayoutResId, mActionBarItemLayoutResId, mDropDownItemLayoutResId, mTextViewResId;

    public static class SpinnerSeparator {
        public int separatorTextResId;

        public SpinnerSeparator(final int resId) {
            separatorTextResId = resId;
        }
    }

    public abstract String getText(int position);

    public SeparatorSpinnerAdapter(final Context ctx, final List<Object> data, final int separatorLayoutResId, final int actionBarItemLayoutResId,
            final int dropDownItemLayoutResId, final int textViewResId) {
        mContext = ctx;
        mData = data;
        mSeparatorLayoutResId = separatorLayoutResId;
        mActionBarItemLayoutResId = actionBarItemLayoutResId;
        mDropDownItemLayoutResId …
Run Code Online (Sandbox Code Playgroud)

android convertview android-spinner

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

显示来自BroadcastReceiver的状态栏通知

我正在编写代码以在特定时间向用户显示通知(就像Google日历应用一样).

我因此创造了:

  • a BroadcastReceiverBOOT_COMPLETED,在接收时它会在一分钟内发出警报,以便在设备仍然装载时不会使设备过载;
  • a BroadcastReceiver听取警报:一分钟后的第一组BOOT_COMPLETED,下一次约会的下一组(如Google日历中)

所以,通常:

  1. BOOT_COMPLETED =>延迟一分钟发起警报
  2. 一分钟后=>接收器为下次预约设置另一个警报
  3. 几分钟/小时/天后,闹钟响起=>接收器显示状态栏通知

这意味着状态栏通知是从BroadcastReceiver.

我在文档中读到应该从活动或服务中启动它们:https://developer.android.com/guide/topics/ui/notifiers/notifications.html#Basics

我在这里要求最佳实践.我应该创建一个Service将由它启动的BroadcastReceiver,并且唯一的目的是启动状态栏通知吗?我的代码正在运行,我只想按照Google的建议创建干净的代码.

notifications android broadcastreceiver

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

将拆分的ActionBar显示两倍的图标

我希望将应用布局设置为他们用于Gmail的应用布局.他们有图标(我的设备上它拥有长达导航应用的标志,并选择优先收件箱/收件箱/等自定义视图),但也有某种分裂的动作条ActionBar,因为在底部,我有几个图标(撰写,搜索,标签等).

我怎么能这样做?我ActionBar通过这个XML 实现了以下内容:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android" >

    <item
        android:id="@+id/menu_gps"
        android:icon="@drawable/icone_gps_continu"
        android:showAsAction="always"
        android:title="@string/menu_gps"/>
    <item
        android:id="@+id/menu_sort"
        android:icon="@drawable/icone_liste_chron"
        android:showAsAction="always"
        android:title="@string/menu_liste"/>
    <item
        android:id="@+id/menu_stats"
        android:icon="@drawable/icone_statistiques"
        android:showAsAction="always"
        android:title="@string/menu_stats"/>
    <item
        android:id="@+id/menu_save"
        android:icon="@drawable/icone_terminersortie"
        android:showAsAction="always"
        android:title="@string/menu_save"/>
    <item
        android:id="@+id/menu_search"
        android:icon="@drawable/ic_launcher"
        android:showAsAction="always"
        android:title="@string/menu_search"/>
    <item
        android:id="@+id/menu_photo"
        android:icon="@drawable/icone_enregistrerphoto"
        android:showAsAction="always"
        android:title="@string/menu_photo">
    </item>
    <item
        android:id="@+id/menu_sound"
        android:icon="@drawable/icone_enregistrerson"
        android:showAsAction="always"
        android:title="@string/menu_sound">
    </item>
    <item
        android:id="@+id/menu_settings"
        android:icon="@drawable/icone_parametres"
        android:showAsAction="always"
        android:title="@string/menu_settings">
    </item>

</menu>
Run Code Online (Sandbox Code Playgroud)

我当然ActionBar通过在清单中添加android:uiOptions="splitActionBarWhenNarrow"我的<application>标签来启用拆分.

我得到的是一个空洞的"顶部" ActionBar; 而底部只显示三个图标.我认为我可以在portait模式中在顶部显示3-4个图标,在底部显示5个图标,并且所有这些图标在横向模式下显示在顶部.

注意:即使我使用Galaxy Nexus在ICS上进行测试,我也使用ActionBarSherlock来提供向后兼容性.

android actionbarsherlock android-actionbar

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

Android上的SQLite数据库,多线程,锁定和帐户同步

我正在尝试获得一个对我的sqlite数据库的多线程访问没有失败的模式.另外,让我疯狂的是我无法重现这个问题.

我有一个使用数据库的应用程序,还有Android帐户和Android同步来同步我的应用程序的数据.我的猜测是,当两者同时发生时,它会崩溃.我遇到了很多错误:

 * android.database.sqlite.SQLiteDatabaseLockedException: database is locked
 * android.database.sqlite.SQLiteDatabaseLockedException: database is locked (code 5)
 * android.database.sqlite.SQLiteDatabaseLockedException: error code 5: database is locked
 * android.database.sqlite.SQLiteDatabaseLockedException: database is locked (code 5): , while compiling: PRAGMA journal_mode
 * android.database.sqlite.SQLiteDiskIOException: disk I/O error (code 778)
 * android.database.sqlite.SQLiteException: Failed to change locale for db '/data/data/net.bicou.redmine/databases/redmine.db' to 'en_US'. \n Caused by: android.database.sqlite.SQLiteDatabaseLockedException: database is locked (code 5)
Run Code Online (Sandbox Code Playgroud)

也许并非所有这些都与相同的根本原因有关,但我有点迷失.

我有的是:

  • 一个抽象基类,DbAdapter由想要管理单个表的子类扩展
  • 管理SQLite数据库的类,DbManager包含一个Lock

现在,用户的版本DbManager不是单例.我打算制作DbManager一个单例,以便所有线程共享同一个对象.这不应该是一个问题,因为据我所知,后台同步和应用程序共享相同的过程.

这是课程(只有相关部分):

public abstract class DbAdapter …
Run Code Online (Sandbox Code Playgroud)

sqlite multithreading android locking

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

如何获取作为属性引用的维度值?

我的维度定义中有这两个项目:

<dimen name="toolbar_search_extended_height">158dp</dimen>
<dimen name="toolbar_search_normal_height">?attr/actionBarSize</dimen>
Run Code Online (Sandbox Code Playgroud)

现在我想在运行时以像素为单位获取实际值:

height = getResources().getDimensionPixelOffset(R.dimen.toolbar_search_extended_height);
height = getResources().getDimensionPixelOffset(R.dimen.toolbar_search_normal_height);
Run Code Online (Sandbox Code Playgroud)

第一个调用给出了设备上以像素为单位的任何 158dp。
第二次调用产生一个NotFoundException

android.content.res.Resources$NotFoundException: Resource ID #0x7f080032 type #0x2 is not valid
Run Code Online (Sandbox Code Playgroud)

类型0x2是:TypedValue#TYPE_ATTRIBUTE

/** The <var>data</var> field holds an attribute resource
 *  identifier (referencing an attribute in the current theme
 *  style, not a resource entry). */
public static final int TYPE_ATTRIBUTE = 0x02;
Run Code Online (Sandbox Code Playgroud)

取消引用dimen可以是实际值或对样式属性的引用的值的首选方法是什么?

android android-resources

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

如何实际查看从Android堆转储中获取的位图

在我的应用程序中跟踪严重内存问题的过程中,我查看了我的应用程序中的几个堆转储,并且大多数时候我有一个我不知道的巨大位图.

它需要9.4MB或9,830,400字节,或者实际上是每像素4字节的1280x1920图像.

我在Eclipse MAT中检查过它确实是一个字节[9830400],它有一个传入引用,它是一个android.graphics.Bitmap.

我想把它转储到一个文件,并尝试看到它.我无法理解它的来源.我所有绘图中最大的形象是640x960 png,不到3MB.

我试图使用Eclipse"将值复制到文件",但我认为它只是将缓冲区打印到文件中,我不知道任何可以读取字节流并将其显示为每像素4个字节的图像软件图片.

任何的想法?

这是我尝试过的:将字节数组转储到文件中,将其推送到/ sdcard/img,然后加载如下活动:

@Override
public void onCreate(final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    try {
        final File inputFile = new File("/sdcard/img");
        final FileInputStream isr = new FileInputStream(inputFile);
        final Bitmap bmp = BitmapFactory.decodeStream(isr);
        ImageView iv = new ImageView(this);
        iv.setImageBitmap(bmp);
        setContentView(iv);
        Log.d("ImageTest", "Image was inflated");
    } catch (final FileNotFoundException e) {
        Log.d("ImageTest", "Image was not inflated");
    }
}
Run Code Online (Sandbox Code Playgroud)

我没有看到任何东西.

你知道如何编码图像吗?说它存储在byte[] buffer.buffer[0]是红色,buffer[1]是绿色等?

android bitmap eclipse-mat

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

为什么我的所有位图都上采样200%?

我的应用程序中存在严重的内存问题[1].为了研究这个问题,我在不同的州采取了我的应用程序的堆积.我看到一些位图占用了大量内存.我写了一个小工具[2],将字节数组解码为Windows位图文件(.bmp),这样我就可以看到位图并将它们与我res/drawable文件夹中的文件进行比较.

我发现我的所有文件都被上采样两次.
我首先检查了最大的一个:堆中超过9MB的字节数组缓冲区,它被解码为一个漂亮的1920x1280图片,而原始的是一个960x640 png文件.
我尝试了第二大,超过3MB,曾经解码显示一个漂亮的754x1200图片,原始大小是......猜怎么着?一个不错的377x600 jpg文件.

是什么赋予了?

我在我的Android Manifest文件中启用了硬件加速(虽然我不确定我真的需要它,我只是使用一些基本的视图和活动).
我在GSM Galaxy Nexus(yakju)上运行Android 4.0.2.我收到测试人员的反馈,他们的4.0.3 Nexus S上存在问题,但我还是无法检查他们的堆转储.

我试图在这里节省内存,如果Android将所有内容加倍,难怪应用程序很快崩溃,因为堆使用率过高(在我的情况下大约为64MB).我希望有一个理由和方法.

参考文献:

  1. 加载活动时出现OutOfMemoryError
  2. 如何实际查看从Android堆转储中获取的位图

heap android memory-management bitmap out-of-memory

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

在tomcat基于Spring的应用程序中使用c3p0连接池

我有一个在tomcat 6下运行的基于Spring的Web应用程序.现在,我想使用c3p0连接池而不是tomcat的默认DBCP.所以,从c3p0帮助文档中,我已经定义了context.xml类似的数据源:

<Resource name="jdbc/sample" auth="Container"
     driverClassName="oracle.jdbc.driver.OracleDriver"
     url="jdbc:oracle:thin:@someServer:1551:xyz"
     username="userName"
     password="pwd"
     validationQuery="SELECT 1 FROM dual"
     testOnBorrow="true"
     testWhileIdle="true"
     factory="org.apache.naming.factory.BeanFactory" 
     type="com.mchange.v2.c3p0.ComboPooledDataSource" 
     maxPoolSize="20" 
     minPoolSize="5" 
     acquireIncrement="1" 
   />
Run Code Online (Sandbox Code Playgroud)

现在,文档说,我应该包括以下内容web.xml:

<resource-ref>
  <res-ref-name>jdbc/sample</res-ref-name>
  <res-type>javax.sql.DataSource</res-type>
  <res-auth>Container</res-auth>
</resource-ref> 
Run Code Online (Sandbox Code Playgroud)

我还有以下内容applicationContext.xml:

<jee:jndi-lookup id="sampleDataSource" resource-ref="true"
    jndi-name="jdbc/sample" />
Run Code Online (Sandbox Code Playgroud)

当我启动tomcat时,我得到了

javax.naming.NameNotFoundException:名称jdbc未绑定在此Context中

没有c3p0并在tomcat6中使用默认连接池工作正常.

任何帮助,将不胜感激.

spring connection-pooling c3p0 tomcat6

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

在appcompat中使用ActionBar的自定义布局会导致内容与操作栏重叠

我已经实现了一个自定义操作栏布局AppCompat:

public class DoneBarActivity {
  public interface OnSaveActionListener {
      public void onSave();
  }

  public static void setupActionBar(final ActionBarActivity activity, 
                                    final OnSaveActionListener listener) {

      // Inflate a "Done/Cancel" custom action bar view.
      final LayoutInflater inflater = (LayoutInflater) activity
          .getSupportActionBar().getThemedContext()
          .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
      final View customActionBarView = inflater.inflate(
          R.layout.actionbar_custom_view_done_cancel, null);
      customActionBarView.findViewById(R.id.actionbar_done)
          .setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View v) {
              // "Done" (or "Save")
              if (listener != null) {
                  listener.onSave();
              }
              activity.finish();
          }
      });
      customActionBarView.findViewById(R.id.actionbar_cancel)
          .setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View …
Run Code Online (Sandbox Code Playgroud)

android android-appcompat android-actionbar

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