代码之家  ›  专栏  ›  技术社区  ›  pp chan

如何使用单独的AsyncTask类连接internet

  •  0
  • pp chan  · 技术社区  · 6 年前

    我上了三节课: MainActivity ,则, Temp (扩展 AsyncTask )以及 HttpHandler

    我正在打电话 临时雇员 在里面 主要活动 。并且在 临时雇员 ,它将调用 处理中心 从URL获取JSON,并最终将其返回到 主要活动 。 但它无法从URL获取任何信息。

    我在网上搜索过这个问题,有人说是关于UI线程的,但我不明白为什么。

    另外,是否有任何方法可以在单独的类中进行连接?因为我有几个活动需要连接到internet,我不想复制和粘贴扩展的 异步任务 在所有其他活动中作为私人课堂上课。

    1 回复  |  直到 6 年前
        1
  •  1
  •   ACrescendo    6 年前

    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();