Loopj是一个用于发出异步HTTP请求的Android库。 我喜欢它的易用性和简单性。 它是由James Smith创建的,也被称为“ Android异步HTTP客户端”,并且已被Instagram,Pinterest 等公司使用 。 这是进入HTTP库世界的一个很好的切入点,它将帮助您轻松地理解重要的概念。
为了学习使用该库,我们将创建MovieTrivia,这是一个简单的应用程序,可连接到Web服务以检索有关电影或电视节目的信息并将此信息显示给用户。
1.设定
首先,创建一个新的Android Studio项目,其中的活动为空。 要包含Loopj,请从官方网站复制依赖项。 您可以在网站的“安装和基本用法”部分下找到依赖项(或仅复制以下字符串)。
compile 'com.loopj.android:android-async-http:1.4.9'
消息“立即同步”将在右上角弹出。 单击它,Gradle将下载该库并将其提供给您的项目。
由于该应用将连接到互联网,因此我们必须声明适当的权限以供用户进行授权。 打开您的AndroidManifest.xml
文件,然后在application
标签之前,输入:
<uses-permission android:name="android.permission.INTERNET"/>
现在您可以开始在应用程序中使用Loopj了。
2.实施
我们将创建尽可能简单的用户界面:仅是TextField
输入搜索词的TextField
,用于执行搜索的Button
和用于显示结果的TextView
。 打开activity_mail.xml
并添加所需的UI组件,如下所示。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:padding="@dimen/activity_vertical_margin"
tools:context="com.pdrogfer.movietrivia.MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<EditText
android:id="@+id/etSearchTerms"
android:layout_width="0dp"
android:layout_weight="3"
android:layout_height="wrap_content"
android:hint="movie or tv show" />
<Button
android:id="@+id/btnSearch"
android:layout_width="0dp"
android:layout_weight="1"
android:layout_height="wrap_content"
android:text="Search" />
</LinearLayout>
<TextView
android:id="@+id/tvSearchResults"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="24dp"
android:hint="search results"/>
</LinearLayout>
现在,像往常一样,在MainActivity.java
连接这些组件。
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
EditText etSearchTerms;
Button btnSearch;
TextView tvSearchResults;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
etSearchTerms = (EditText) findViewById(R.id.etSearchTerms);
btnSearch = (Button) findViewById(R.id.btnSearch);
tvSearchResults = (TextView) findViewById(R.id.tvSearchResults);
btnSearch.setOnClickListener(this);
}
@Override
public void onClick(View v) {
String searchTerm = etSearchTerms.getText().toString();
etSearchTerms.setText("");
// make Loopj HTTP call
}
}
为了保持代码的整洁有序,请创建一个单独的Java类MyLoopjTask.java
,以包含所有特定于Loopj的代码和操作。 您将需要两个实例变量,一个类型为RequestParams
以将搜索详细信息构建到URL中,另一个类型为AsyncHttpClient
以实际发出HTTP请求。 在继续之前,请检查Android Studio是否已添加这些必需的导入。
import org.json.JSONObject;
import cz.msebera.android.httpclient.Header;
还创建一个将用户查询作为参数的方法-这是完成实际工作的地方。
public class MyLoopjTask {
private static final String TAG = "MOVIE_TRIVIA";
AsyncHttpClient asyncHttpClient;
RequestParams requestParams;
String BASE_URL = "http://www.omdbapi.com/?";
String jsonResponse;
public MyLoopjTask() {
asyncHttpClient = new AsyncHttpClient();
requestParams = new RequestParams();
}
public void executeLoopjCall(String queryTerm) {
requestParams.put("s", queryTerm);
asyncHttpClient.get(BASE_URL, requestParams, new JsonHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
super.onSuccess(statusCode, headers, response);
jsonResponse = response.toString();
Log.i(TAG, "onSuccess: " + jsonResponse);
}
@Override
public void onFailure(int statusCode, Header[] headers, Throwable throwable, JSONObject errorResponse) {
super.onFailure(statusCode, headers, throwable, errorResponse);
Log.e(TAG, "onFailure: " + errorResponse);
}
});
}
}
如您所见,您可以在RequestParams
实例中添加所有必需的API请求参数键(在这种情况下,仅是用户输入的查询)。 此版本的get()
方法将JSON对象返回到onSuccess
,但是还有其他变体可以满足您的需求。 (使用Ctrl+O
查看此方法的其他版本。)
这是实现Loopj客户端以对Web服务进行HTTP调用所需的全部操作。 在我们的情况下,我们希望在用户单击“搜索”按钮时发送请求。 因此,返回MainActivity
,创建MyLoopjTask
的实例,并在onClick
调用executeLoopjCall
使用用户输入的术语。 MainActivity
将如下所示。
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
EditText etSearchTerms;
Button btnSearch;
TextView tvSearchResults;
MyLoopjTask myLoopjTask;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
etSearchTerms = (EditText) findViewById(R.id.etSearchTerms);
btnSearch = (Button) findViewById(R.id.btnSearch);
tvSearchResults = (TextView) findViewById(R.id.tvSearchResults);
btnSearch.setOnClickListener(this);
myLoopjTask = new MyLoopjTask();
}
@Override
public void onClick(View v) {
String searchTerm = etSearchTerms.getText().toString();
etSearchTerms.setText("");
// make loopj http call
myLoopjTask.executeLoopjCall(searchTerm);
}
}
现在,如果您运行该应用程序,则应该在日志窗口中看到请求的结果。
3.将结果发布到UI
将异步操作分离为专用类有助于保持代码的整洁,但这意味着我们无法直接访问UI元素。 为了显示这些请求的结果,我建议创建一个侦听器界面。 这是一种常见策略,例如在此堆栈溢出问题中进行了讨论 。 它包含三个简单步骤。
创建一个界面
首先,使用单个方法创建一个接口,当从Loopj获得HTTP请求的结果时将调用该方法。
public interface OnLoopjCompleted {
public void taskCompleted(String results);
}
更新异步任务处理程序
在MyLoopjTask
,修改构造函数,使其将Context
和OnLoopjCompleted
实例作为参数。
public MyLoopjTask(Context context, OnLoopjCompleted listener) {
asyncHttpClient = new AsyncHttpClient();
requestParams = new RequestParams();
this.context = context;
this.loopjListener = listener;
}
现在,当请求结果在MyLoopjTask
中可用时,将其传递给侦听器接口的方法。
@Override
public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
super.onSuccess(statusCode, headers, response);
jsonResponse = response.toString();
loopjListener.taskCompleted(jsonResponse);
Log.i(TAG, "onSuccess: " + jsonResponse);
}
更新活动
最后,使要更新的活动(在本例中为MainActivity
实现OnLoopjCompleted
。 将myLoopjTask
的初始化更新为myLoopjTask = new MyLoopjTask(this, this);
。
由于您的活动现在实现了OnLoopjCompleted
,因此Android Studio会强制您实现taskCompleted
方法。 在那里,您可以使用新数据更新UI。
@Override
public void taskCompleted(String results) {
tvSearchResults.setText(results);
}
4.结论
你有它。 当您运行应用程序时,来自异步HTTP请求的所有数据都将显示给用户。 自然,您将需要解析接收到的JSON数据以仅提取所需的部分。 例如,您可以通过将海报图像URL传递给Picasso来显示电影海报。
在本教程中,您已经了解了如何使用Loopj,Loopj是在Android中执行异步HTTP请求的库。 只需几行代码,Loopj就易于使用。 现在,您没有任何借口可以不让您的应用程序与您喜欢的网络服务中的内容保持最新!
翻译自: https://code.tutsplus.com/tutorials/an-introduction-to-loopj--cms-26781