Android不允许在主线程中运行某些任务,例如http请求,这会降低主应用程序的速度。你必须在后台用一个单独的线程来完成这类工作。
AsyncTask和AsyncTaskLoader是实现此作业的良好选择。
[
https://developer.android.com/reference/android/os/AsyncTask.html]
[
https://developer.android.com/reference/android/content/AsyncTaskLoader.html]
如果您的工作可能需要很长时间,并且在某些情况下不希望内存泄漏,请使用AsyncTaskLoader。
作为起点,我想向您介绍以下信息:
在您的主要活动中,实现这一点。
implements LoaderManager.LoaderCallbacks<List<Your Data Type To Fetch>>
然后重写这些方法:
public Loader<List<YourDataType>> onCreateLoader(int i, Bundle bundle)
public void onLoadFinished(Loader<List<YourDataType>> loader, List<YourDataType> mList)
public void onLoaderReset(Loader<List<YourDataType>> loader)
现在在新类中创建一个加载程序,如下所示:
public class SampleLoader extends AsyncTaskLoader<List<YourDataType>>
在loader类中重写这些方法:
public List<YourDataType> loadInBackground()
protected void onStartLoading()
loadInbackground
方法将是您执行任务的主要方法。
onStartLoading
方法将在加载程序启动时调用。使用
forceLoad()
在里面。[
https://developer.android.com/reference/android/content/Loader.html#forceLoad()]
最后,在创建和启动加载程序时,请在主活动中使用下面的代码
onCreate()
方法
getLoaderManager().initLoader(1, null, this);
注意:1是装载机标识符编号,您可以使用不同的编号。
注意:对于具有url和get方法的http请求:
HttpURLConnection urlConnection = null;
try {
urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setReadTimeout(10000 /* milliseconds */);
urlConnection.setConnectTimeout(15000 /* milliseconds */);
urlConnection.setRequestMethod("GET");
urlConnection.connect();