我在Android上使用Retrofit.
我定义了一个服务GitHubService
.
public interface GithubService {
@GET("users/{user}")
Call<ResponseBody> fetchUserInfo(@Path("user") String user);
}
Run Code Online (Sandbox Code Playgroud)
然后我创建服务.
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://api.github.com")
.build();
GithubService service = retrofit.create(GithubService.class);
Call<ResponseBody> call = service.fetchUserInfo("coxier");
call.enqueue(...);
Run Code Online (Sandbox Code Playgroud)
如您所见,我使用上面的代码来获取github的用户信息.以上代码适合我.现在我想知道Retofit是如何工作的所以我读了源代码Retrofit#create
.下面的代码是.阅读后,我仍然不知道它的魔力然后我决定调试Retroft.
public <T> T create(final Class<T> service) {
...
return (T) Proxy.newProxyInstance(...,
new InvocationHandler() {
...
@Override public Object invoke(..)
throws Throwable {
if (method.getDeclaringClass() == Object.class) {
return method.invoke(this, args);
}
...
return loadServiceMethod(method).invoke(args != null ? args : emptyArgs);
}
});
}
Run Code Online (Sandbox Code Playgroud)
我在线调试if(method.getDeclaringClass() == …
如您所知,如果我们想要实现多种类型RecyclerView
,我们应该提供多种CustomViewHolder
扩展RecyclerView.ViewHolder
.
对于exmpale,
class TextViewHolder extends RecyclerView.ViewHolder{
TextView textView;
}
class ImageViewHolder extends RecyclerView.ViewHolder{
ImageView imageView;
}
Run Code Online (Sandbox Code Playgroud)
然后我们必须覆盖getItemViewType
.并onCreateViewHolder
进入构造TextViewHolder
或ImageViewHolder
.
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == 0) {
return new ImageViewHolder(mLayoutInflater.inflate(R.layout.item_image, parent, false));
} else {
return new TextViewHolder(mLayoutInflater.inflate(R.layout.item_text, parent, false));
}
}
Run Code Online (Sandbox Code Playgroud)
上面的代码是正常的,但还有另一种方式.
我想只有一个CustomViewHolder
就足够了.
class MultipleViewHolder extends RecyclerView.ViewHolder{
TextView textView;
ImageView imageView;
MultipleViewHolder(View itemView, int type){
if(type == …
Run Code Online (Sandbox Code Playgroud) android android-layout android-view android-viewholder android-recyclerview
发出网络请求对 Python 来说很容易,而使sync
请求变得容易的是该请求。
在 Dart 中,我可以提出这样的请求:
HttpClient client = new HttpClient();
client.getUrl(Uri.parse("http://www.example.com/"))
.then((HttpClientRequest request) {
// Optionally set up headers...
// Optionally write to the request object...
// Then call close.
...
return request.close();
})
.then((HttpClientResponse response) {
// Process the response.
...
});
Run Code Online (Sandbox Code Playgroud)
显然这是异步请求。在我看来,上面的代码可以重复使用很多次。所以我想发出一个请求并返回一个 JSON 对象。
getResponse(String url) async {
HttpClient httpClient = new HttpClient();
HttpClientRequest request = await httpClient.getUrl(Uri.parse(url));
HttpClientResponse response = await request.close();
String responseBody = await response.transform(utf8.decoder).join();
Map jsonResponse = jsonDecode(responseBody) as Map; …
Run Code Online (Sandbox Code Playgroud) 我的项目有两个目录common
和core
.
root
|----common
| |-----__init__.py
| |-----util.py
|
|------core
|-----__init__.py
|------iemoji.py
Run Code Online (Sandbox Code Playgroud)
在 root 中,我执行python core/iemoji.py
,出现错误。
回溯(最近一次调用最后一次):
文件“core/iemoji.py”,第 6 行,在
来自 common import util 的 模块中
ImportError:没有名为 common 的模块
我像这样导入 utils.py:
from common import util
Run Code Online (Sandbox Code Playgroud) 在ffmpeg
4.0中,有几个h264编码器.如果你使用./configure --list-encoders | grep "h264"
,你可以看到它们.
我不知道它们之间有什么区别.我想使用ffmpeg将本地gif转换为mp4,那么哪个编码器适合我?
onDelete
在Kotlin类中有一个方法.
override fun onDelete(position: Int) {
templates?.apply {
val deleteDialog = DeleteTemplateDialog(view.getViewContext())
deleteDialog.confirmListener = {
CustomTemplateRepository.getInstance().deleTemplate(this[position].templateId!!)
.subscribe({
deleteDialog.dismiss()
this.removeAt(position)
customTemplateAdapter?.notifyDataSetChanged()
view.showEmptyView(this.isEmpty())
}, {})
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我构建release-apk时,我启用proguard
但由于以下警告而失败.
警告:com.uniquestudio.android.iemoji.module.library.customtemplate.MyTemplatePresenter $ onDelete $ 1 $ 1 $ 2:找不到引用的类com.uniquestudio.android.iemoji.module.library.customtemplate.MyTemplatePresenter $ onDelete $ 1 $ 1
当我使用dex2jar从debug-APK检索此类时.我懂了.
public void onDelete(final int paramInt)
{
final DeleteTemplateDialog localDeleteTemplateDialog = new DeleteTemplateDialog(this.view.getViewContext());
localDeleteTemplateDialog.setConfirmListenner((Function0)new Lambda(localArrayList)
{
public final Disposable invoke()
{
CustomTemplateRepository localCustomTemplateRepository = CustomTemplateRepository.Companion.getInstance();
String str = ((Template)this.receiver$0.get(paramInt)).getTemplateId();
if (str == null) {
Intrinsics.throwNpe(); …
Run Code Online (Sandbox Code Playgroud) 我困惑gradle build lifecycle
了几天。参考告诉我
Gradle 构建具有三个不同的阶段。
- 初始化
- 配置
- 执行
第三步是创建任务吗?如果是这样,如何在项目对象中gradle
找到所有内容tasks
?
这是一个例子。
rootporject
|----app
|----build.gradle
|----checkstyle.gradle
Run Code Online (Sandbox Code Playgroud)
的build.gradle
很简单,只要正常。checkstyle.gradle
文件有任务。这是它的内容。
apply plugin: 'checkstyle'
task checkstyle(type:Checkstyle) {
description 'Runs Checkstyle inspection against girl sourcesets.'
group = 'Code Quality'
configFile rootProject.file('checkstyle.xml')
ignoreFailures = false
showViolations true
classpath = files()
source 'src/main/java'
}
Run Code Online (Sandbox Code Playgroud)
之后./gradlew -q tasks
,就没有任务了checkstyle
。
但是,如果我将定义删除到 中build.gradle
,我就明白了。
有什么问题吗?提前致谢。
来自文档
Project 和 build.gradle 文件之间存在一对一的关系。
Adb命令adb shell dumpsys package com.hackerli.girl
可以帮助我获取应用程序信息.
在我请求android.permission.WRITE_EXTERNAL_STORAGE
许可之前,我的应用程序有一个gids=[3003]
.
requested permissions:
android.permission.INTERNET
android.permission.WRITE_EXTERNAL_STORAGE
android.permission.READ_EXTERNAL_STORAGE
android.permission.ACCESS_NETWORK_STATE
install permissions:
android.permission.INTERNET: granted=true
android.permission.ACCESS_NETWORK_STATE: granted=true
User 0: ceDataInode=1531967 installed=true hidden=false suspended=false stopped=true notLaunched=false enabled=0
gids=[3003]
runtime permissions:
User 999: ceDataInode=0 installed=false hidden=false suspended=false stopped=true notLaunched=true enabled=0
gids=[3003]
runtime permissions:
Run Code Online (Sandbox Code Playgroud)
在android.permission.WRITE_EXTERNAL_STORAGE
授予运行时权限后,我得到以下信息.
requested permissions:
android.permission.INTERNET
android.permission.WRITE_EXTERNAL_STORAGE
android.permission.READ_EXTERNAL_STORAGE
android.permission.ACCESS_NETWORK_STATE
install permissions:
android.permission.INTERNET: granted=true
android.permission.ACCESS_NETWORK_STATE: granted=true
User 0: ceDataInode=1531967 installed=true hidden=false suspended=false stopped=false notLaunched=false enabled=0
gids=[3003]
runtime permissions:
android.permission.READ_EXTERNAL_STORAGE: granted=true
android.permission.WRITE_EXTERNAL_STORAGE: granted=true
User …
Run Code Online (Sandbox Code Playgroud) 正如标题所示,我想使用 RxJava2 和 okhttp 下载文件。而且还需要过程。
在我看来,数据流是String url
-> Response
-> 乘法Float process
。
所以首先我需要一个Single
发出Response
.
Single.create((SingleOnSubscribe<Response>) emitter -> {
emitter.onSuccess(xx);// or throw error
});
Run Code Online (Sandbox Code Playgroud)
接下来我需要Flowable
对吗?因为我想向观察者发送多个进程信息。
那么这里我该怎么办呢?提前致谢。
我尝试转换Single
为Flowable
.
Single.create((SingleOnSubscribe<Response>) emitter -> {
emitter.onSuccess(xxx);// or throw error
}).toFlowable()
.flatMap((Function<Response, Publisher<Float>>) response -> Flowable.create(xxx))
.subscribe(process -> {});
}
Run Code Online (Sandbox Code Playgroud)
但我不知道这样做是否合适。
我不关心 okhttp 细节,我只关心与RxJava
诸如Single
和相关的内容Flowable
。