gpt4 book ai didi

java - 如何使用单独的 AsyncTask 类连接互联网

转载 作者:行者123 更新时间:2023-12-02 11:26:33 26 4
gpt4 key购买 nike

我有三个类:MainActivityTemp(扩展AsyncTask)和HttpHandler

我正在尝试在 MainActivity 中调用 Temp。而在Temp中,它会调用HttpHandler从URL中获取JSON,最后返回给MainActivity。但它无法从 URL 获取任何内容。

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

此外,是否有办法在单独的类(class)中建立连接?因为我有几个 Activity 需要连接到互联网,并且我不想将扩展的 AsyncTask 类复制并粘贴到所有其他 Activity 中作为私有(private)类。

最佳答案

Android 不允许某些任务在主线程中运行,例如 http 请求,这会减慢主应用程序的速度。您必须使用单独的线程在后台执行此类工作。

AsyncTask 和 AsyncTaskLoader 是完成这项工作的不错选择。[https://developer.android.com/reference/android/os/AsyncTask.html][https://developer.android.com/reference/android/content/AsyncTaskLoader.html]

如果您的工作可能需要很长时间并且您不希望在某些情况下出现内存泄漏,请使用 AsyncTaskLoader。

首先,我想向您提供以下信息:

在您的主要 Activity 中实现此操作。

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>>

在加载器类中重写这些方法:

public List<YourDataType> loadInBackground() 
protected void onStartLoading()

loadInbackground 方法将是您执行任务的主要方法。onStartLoading 方法将在加载程序启动时被调用。在其中使用forceLoad()。 [https://developer.android.com/reference/android/content/Loader.html#forceLoad()]

最后,创建并启动加载程序,在主 Activity 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();

关于java - 如何使用单独的 AsyncTask 类连接互联网,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49585336/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com