我应该如何实现这个辅助线程以避免错误? (机器人)

时间:2014-05-25 17:45:47

标签: android sqlite error-handling

我在我的Android应用中实现了一个闪屏:

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

我正在使用AsyncTask来完成所有事情,如果用户在流程中间关闭应用程序或因为应用程序关闭设备,我的问题就出现了:

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

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

所以......我怎么能避免这个?我应该使用处理程序,加载程序,on-(暂停,停止,销毁)方法来实现我的目标吗?你能举个例子吗?

1 个答案:

答案 0 :(得分: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>