【问题标题】:How should I implement this secondary thread to avoid errors? (Android)我应该如何实现这个辅助线程以避免错误? (安卓)
【发布时间】:2014-07-14 12:33:53
【问题描述】:

我正在我的 Android 应用程序中实现一个启动画面:

  • 从服务器下载 sqlite 数据库
  • 加载 url 以获取 JSON
  • 在设备中创建一个 sqlite 数据库并执行多个查询

我正在使用 AsyncTask 做所有事情,如果用户在过程中关闭应用程序或关闭设备,我的问题就会出现,因为应用程序:

  • 可能正在设备中创建数据库或执行关键查询
  • 可能正在从服务器下载 sqlite 数据库
  • 可能正在运行几个重要进程

当然,整个过程(3-5 秒)很重要。

那么...我怎样才能避免这种情况呢?我应该使用处理程序、加载程序、on-(pause、stop、destroy) 方法来实现我的目标吗?可以举个例子吗?

【问题讨论】:

  • 您需要在服务中执行此代码这将解决您的应用关闭问题。

标签: android sqlite error-handling


【解决方案1】:

正如上面评论中提到的,您应该使用服务,因为它们的生命周期与活动的生命周期是分开的。

像这样创建服务:

public class MyService extends Service {

    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return null;
    }


    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // Do everything you need to here, then call stop:
        Log.d("DEBUG", "Started...");

        stopSelf();
        return super.onStartCommand(intent, flags, startId);
    }


    @Override
    public void onDestroy() {
        Intent intent = new Intent("com.example.androidexample.SERVICE_STOPPING");
        sendBroadcast(intent);
        super.onDestroy();
    }

}

然后在活动中:

public class MainActivity extends Activity {

    private ServiceCompleteReceiver receiver;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        IntentFilter filter;

        receiver = new ServiceCompleteReceiver();
        filter = new IntentFilter("com.example.androidexample.SERVICE_STOPPING");
        startService(new Intent(this, MyService.class));
        registerReceiver(receiver, filter);
    }


    public class ServiceCompleteReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            // Do whatever needs to be done here

            unregisterReceiver(receiver);
        }

    }

}

编辑:

不要忘记将其添加到您的清单中

   <service
        android:name="com.example.androidexample.MyService"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
    </service>

【讨论】:

  • 感谢您的回答。这对我来说是一个很好的解决方案,但是:我怎么知道服务是否完成?如何将信息从服务发布到 UI?如果用户关闭设备怎么办?
  • 您可以使用来自支持库的 LocalBroadcastManager 或更高级的来自 Square square.github.io/otto 的 Otto。基本上,您注册您的活动以接收从您的服务发送的操作。
  • 我已经编辑了我的答案以包括广播接收器。现在,当服务被销毁时,会通知activity,并调用ServiceCompleteReceiveronReceive方法
  • 关于用户关闭设备,您也应该注册 ACTION_SHUTDOWN 广播,然后根据您的需要进行处理。
  • 非常感谢。您认为我应该在辅助线程还是在主线程中执行服务?
猜你喜欢
  • 2018-09-28
  • 2011-09-30
  • 2020-12-18
  • 1970-01-01
  • 1970-01-01
  • 2018-07-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多