webview的简单使用
要使用webview很简单,不过要在androidmainfest.xml声明权限。
权限:
<uses-permission android:name="android.permission.INTERNET"/>
aictiviy代码:
public class WebViewActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_web_view);
WebView webView =findViewById(R.id.web_but1);
webView.getSettings().setJavaScriptEnabled(true);
webView.setWebViewClient(new WebViewClient());
webView.loadUrl("https://www.baidu.com");
}
}
布局里面就一个控件:
<WebView
android:id="@+id/web_but1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:ignore="MissingConstraints" />
Retrofit基本用法
retorfit是基于okhttp封装的异步请求网络组件。
因为异步代码不能操作UI。所以需要使用回调方式来解决。回调是用接口来实现的。
为什么会出现回调?
当外部的调用者启用一个线程执行任务,不管线程执行情况如何,都不会阻塞当前代码等线程返回执行结果,而是选择继续执行下面的代码。如果需要线程执行完任务,就交给外部调用者处理返回结果,就需要用到回调了。
具体的做法是,线程放在独立的函数里,调用者调用该函数,传递一个对象,这个对象是调用者的内部类,内部类里面的方法接收线程返回的结果,可以直接通过访问外部成员和返回的结果进行关联操作。
这样线程函数接收到这个对象,执行完后,直接将结果传递给传递过来的对象函数即可。
举个例子:
//建立一个接口,
interface AppService{
fun invoke(User u)
}
线程信息:
fun void run(AppService service){
Thread{
//线程任务信息
//回调,返回结果信息
service.invoke(user)
}
}
调用者:
//调用线程任务的函数,传递匿名类,类中invoke方法接受线程返回结果,调用者直接处理这个结果
run(new AppSerive{
override fun invoke(User u){
//处理u,并且和外部类成员交互
}
})
这就完成了回调。
Retrofit 也是将请求信息给线程信息执行,执行完回调完成整个请求过程。
具体示例如下:
1、访问网络,先在Androidmainfest.xml声明权限:
<uses-permission android:name="android.permission.INTERNET"/>
2、建立一个处理数据的接口
public interface AppService{
@GET("resouce/list")
Call<ResouceBean> invoke();
}
call类型为retfofile内置类型,是固定写法,返回一个约束的对象。
3、调用者:
public class WebViewActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_web_view);
Button btn = findViewById(R.id.btn_open_web);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//构建Retrofit对象
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("域名")
.addConverterFactory(GsonConverterFactory.create())
.build();
AppService appService =retrofit.create(AppService.class);
//enqueue线程异步请求,因为线程无法直接操作UI,所以将对象传入,在enqueue完成后,调用对象方法,完成UI更新,称为回调。
appService.invoke().enqueue(new Callback<ResouceBean>() {
@Override
public void onResponse(Call<ResouceBean> call, Response<ResouceBean> response) {
// 处理结果
ResouceBean body = response.body();
}
@Override
public void onFailure(Call<ResouceBean> call, Throwable t) {
//处理失败
t.printStackTrace();
}
});
}
});
}
}