我是Java的初学者,也是Android的编码员。当我编写一个发出一些网络请求的应用程序时,我收到了NetworkOnMainThreadException异常。我用Google搜索并找出原因和解决方案。但我还有一个问题。我的应用程序在不同的站点上发出请求,并将对响应执行不同的操作(首先响应登录操作,将检查,第二个操作是一些api调用,第三个操作是请求图像),我想我不应该为每种情况(doInBackground都是相同的,但不同的onPostExecute方法将在这里)。我该如何解决这个问题?感谢
答案 0 :(得分:0)
你可以将一个aditional变量作为doInBackground Params传递,保存为" global"类变量并在onPostExecute中切换所以你不必创建3个不同的类
喜欢这个
public class Async_DL extends AsyncTask<String, String, String> {
String type_of_request;
String url;
@Override
protected void onPreExecute(){
}
@Override
protected String doInBackground(String... params) {
this.url = params[0];
this.type_of_request = params[1];
doinBackground stuff....
}
@Override
protected void onPostExecute(String result) {
switch(this.type_of_request){
case a:
do some stuff
break;
}
}
}
答案 1 :(得分:0)
一种解决方案是创建一个像这样的接口回调
interface Callback {
public void call (String response); //or whatever return type you want
}
然后你可以像这样扩展你的AsyncTask类
private class HttpTask extends AsyncTask <Void,Void,String> {
Callback callback;
HttpTask (Callback callback) {
this.callback = callback;
}
// your doInBackground method
@Override
protected void onPostExecute (String response) {
callback.call(response);
}
}
然后你可以这样打电话给你AsyncTask
new HttpTask (new Callback () {
@Override
public void call (String response) { /* Here goes implementation */ }
}).execute();
答案 2 :(得分:0)
您不需要为每个动作制作三个单独的类。您只能在AsyncTask中扩展一次,我建议添加一个可以由您的活动实现的接口调用:
public interface RequestListener {
public void onLoginCall();
public void onApiCall();
public void onImageCall();
}
同时创建一个枚举来保存请求&#39;类型:
public enum RequestType{
LOGIN,
API,
IMAGE;
}
同时,您可以扩展AsyncTask并根据每种情况调用必要的侦听器方法。您可以使用第二个属性来保存请求的类型:
public class RequestTask extends AsyncTask<Object, RequestType, Object> {
private RequestListener listener;
@Override
protected void onPreExecute(){
}
@Override
protected String doInBackground(Object... params) {
this.url = params[0];
this.type_of_request = params[1];
doinBackground stuff....
}
@Override
protected void onPostExecute(Object result) {
if(result is from login)
listener.onLoginCall();
... and so on
}
}