Android I';我正在使用AsyncTask并获得线程错误
我正在通过AsyncTask innerclass向Yelp API发出请求。当我试图在onPostExecute()中打印结果时,会出现错误。这是我的密码:Android I';我正在使用AsyncTask并获得线程错误,android,multithreading,android-asynctask,Android,Multithreading,Android Asynctask,我正在通过AsyncTask innerclass向Yelp API发出请求。当我试图在onPostExecute()中打印结果时,会出现错误。这是我的密码: public class MainActivity extends Activity { Yelp yelp = new yelp(....); yelp.execute(); public class Yelp extends AsyncTask<String,Void,Response> { double _lo
public class MainActivity extends Activity {
Yelp yelp = new yelp(....);
yelp.execute();
public class Yelp extends AsyncTask<String,Void,Response> {
double _long = 1;
double _lat= 1;
String _term = "sushi";
OAuthService service;
Token accessToken;
public Yelp(String consumerKey, String consumerSecret, String token, String tokenSecret) {
this.service = new ServiceBuilder().provider(YelpApi2.class).apiKey(consumerKey).apiSecret(consumerSecret).build();
this.accessToken = new Token(token, tokenSecret);
}
@Override
protected void onPostExecute(Response re) {
try{
System.out.println(re.getBody());
}
catch(Exception e){
e.printStackTrace();
}
}
@Override
protected Response doInBackground(String... params) {
OAuthRequest request = new OAuthRequest(Verb.GET, "http://api.yelp.com/v2/search");
request.addQuerystringParameter("term", _term);
request.addQuerystringParameter("ll", _lat + "," + _long);
this.service.signRequest(this.accessToken, request);
Response r = request.send();
return r;
}
}
}
onPostExecute()
在主线程上运行,不鼓励/不允许在主线程上处理网络操作。将所有网络操作移动到doInBackground()
以避免抛出此错误我猜是响应。getBody打开流并读取响应,这就是android在主线程上将其标记为网络的原因。您应该从doInBackground中的响应中读取字符串,并将字符串而不是响应返回到onPostExecute,这意味着将声明更改为扩展异步任务
,并将doInBackground的返回类型更改为字符串
这两行:
this.service = new ServiceBuilder().provider(YelpApi2.class).apiKey(consumerKey).apiSecret(consumerSecret).build();
this.accessToken = new Token(token, tokenSecret);
他们正在进行网络操作,这就是你的应用程序崩溃的原因。从构造函数中获取所需的任何引用,并在doInBackground上进行这些调用
编辑:
digitaljoel指出日志指向onPostExecute行,唯一合乎逻辑的答案是:
postExecute中的方法
re.getBody()
执行网络操作。我假设这个公共Yelp(String consumerKey,String ConsumerCret,String token,String tokenSecret){this.service=new ServiceBuilder().provider(yelpapip2.class).apiKey(consumerKey).apiSecret(ConsumerCret.build());this.accessToken=new Token(Token,tokenSecret);}makes http requestsWell关于“未检测到GPU仿真的仿真器”的错误。修复了吗?您是否在正确的模拟器上运行此操作。这可能会导致错误,我们将不胜感激,因为这是您的解决方案。
this.service = new ServiceBuilder().provider(YelpApi2.class).apiKey(consumerKey).apiSecret(consumerSecret).build();
this.accessToken = new Token(token, tokenSecret);