[英]android.os.NetworkOnMainThreadException into AsyncTask
[英]Android.OS.NetworkOnMainThreadException in
我正在尝试获取Users facebook个人资料图片及其缩略图,并将其下载后添加到parse类中。 看一看
@Override
protected String doInBackground(String[] Params)
{
String accessToken = AccessToken ;
String email = EMAIL;
profile = com.facebook.Profile.getCurrentProfile();
User.put("displayName", profile.getName());
User.put("facebookId", profile.getId());
User.setUsername(profile.getId());
try
{
User.put("FBaccessToken", accessToken);
User.setEmail(email);
}
catch (Exception e){
Log.e("ERROR","Failed");
}
User.setPassword(profile.getId() + profile.getId());
ParseQuery<ParseObject> query = ParseQuery.getQuery("User");
query.whereEqualTo("username", profile.getId());
query.findInBackground(new FindCallback<ParseObject>() {
@Override
public void done(List<ParseObject> list, ParseException e)
{
if (e == null)
{
//brace the lord no error
if (list == null)
{
parseSignUp() ;
}
else
{
if (list.isEmpty())
{
parseSignUp() ;
}
else
{
login(profile.getId(), (profile.getId() + profile.getId()));
}
for (ParseObject str : list)
{
Log.e("ERROR", "what ?");
}
}
}
else
{
Log.e("ERROR", "not");
}
}
});
return "done";
}
Login.java
SendFeedBackJob newJob = new SendFeedBackJob();
newJob.progressBar = progressBar ;
newJob.EMAIL = email ;
newJob.AccessToken = accessToken.getToken();
newJob.invisible = View.INVISIBLE ;
newJob.show = View.VISIBLE ;
newJob.execute();
即使网络内容在AsyncTask中,此代码仍会引发此错误
12-04 19:02:27.773 4263-4263/com.socketmill.thisismohit.vine E/ERROR﹕android.os.NetworkOnMainThreadException
12-04 19:02:27.803 4263-4263/com.socketmill.thisismohit.vine E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.NullPointerException
at com.parse.ParseFile.<init>(ParseFile.java:188)
at com.parse.ParseFile.<init>(ParseFile.java:218)
at com.socketmill.thisismohit.vine.SendFeedBackJob.parseSignUp(SendFeedBackJob.java:207)
at com.socketmill.thisismohit.vine.SendFeedBackJob$1.done(SendFeedBackJob.java:90)
at com.socketmill.thisismohit.vine.SendFeedBackJob$1.done(SendFeedBackJob.java:75)
at com.parse.ParseTaskUtils$2$1.run(ParseTaskUtils.java:115)
at android.os.Handler.handleCallback(Handler.java:615)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4921)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805)
at dalvik.system.NativeStart.main(Native Method)
仅仅因为它在doInBackground中开始,并不意味着其中的整个代码都在后台线程中运行。 可能您正在使用的库正在发送以提供使用UI线程的回调。
阅读文档时 , query.findInBackground(new FindCallback<ParseObject>() {})
方法将在UI Thread上运行public void done(List<ParseObject> list, ParseException e)
方法。
这意味着您的parseSignUp()
方法以及geByteArrayFromURL
方法也都在UI线程上运行。
实际上,考虑到“解析库”为您处理所有这些事实。 您可能应该完全从AsyncTask中删除解析库。 由于它将在库完成执行之前转到onPostExecute()
(您可以在doInBackground
内部启动一个新线程。
FindInBackground的done回调方法在UI线程上运行,而不在异步线程上运行
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.