Android 具有以上API 11的AsyncTask使应用程序崩溃
我正在使用Android 具有以上API 11的AsyncTask使应用程序崩溃,android,android-asynctask,Android,Android Asynctask,我正在使用AsyncTask和gson解析提要,一切正常。但在一个片段中我将被迫关闭API 11以上设备上的应用程序。在API 11以下的设备中也可以。这是我的代码: public class LatestSubmissions extends SherlockListFragment { SharedPreferences prefs; LatestSubmissionsAdapter adapter = null; ArrayList<HashMap<S
AsyncTask
和gson
解析提要,一切正常。但在一个片段中
我将被迫关闭API 11以上设备上的应用程序。在API 11以下的设备中也可以。这是我的代码:
public class LatestSubmissions extends SherlockListFragment {
SharedPreferences prefs;
LatestSubmissionsAdapter adapter = null;
ArrayList<HashMap<String, String>> submissions = new ArrayList<HashMap<String, String>>();
private GetSubmissionsListTask submissionTask = null;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
ConnectionDetector cd = new ConnectionDetector(getSherlockActivity());
if (cd.isConnectingToInternet()) {
prefs = getSherlockActivity().getSharedPreferences(
CommonUtils.PREFERENCE_NAME, 0);
submissionTask = new GetSubmissionsListTask();
submissionTask.execute(CommonUtils.USER_SUBMISSION_URL
+ prefs.getString(CommonUtils.KEY_USER_ID, "339") + "/10");
} else {
MainActivity.networkAvailabilityNotice(getSherlockActivity());
}
return super.onCreateView(inflater, container, savedInstanceState);
}
protected class GetSubmissionsListTask extends
AsyncTask<String, Void, InputStreamReader> {
@Override
protected InputStreamReader doInBackground(String... params) {
return new JSONDownloader().getJSONStringFromUrl(params[0]);
}
@Override
protected void onPostExecute(InputStreamReader isr) {
if (isr != null) {
MainActivity activity = (MainActivity) getSherlockActivity();
JsonReader reader = new JsonReader(isr);
try {
reader.beginObject();
reader.nextName(); // name
reader.skipValue();
reader.nextName(); // uname
reader.skipValue();
String subs = reader.nextName(); // subs
if (subs.equals(CommonUtils.KEY_SUBMISSION)) {
reader.beginArray();
while (reader.hasNext()) {
HashMap<String, String> map = new HashMap<String, String>();
reader.beginArray();
reader.skipValue(); // submission id
String txt = "Latest problem";
Problems obj = MainActivity.problems.get(reader
.nextInt());
if (obj != null) {
txt = obj.getProblemsInfo();
}
map.put(CommonUtils.KEY_PROBLEM_ID, txt);
Verdict verdict = activity.verdicts.get(reader
.nextString()); // verdict id
map.put(CommonUtils.KEY_VERDICT_COLOR,
verdict.verdictColorHex);
map.put(CommonUtils.KEY_VERDICT_ID, verdict.name);
Double execTime = reader.nextDouble() / 1000; // execution
// time
map.put(CommonUtils.KEY_RUNTIME,
execTime.toString() + "s");
reader.skipValue(); // submission time
map.put(CommonUtils.KEY_LANGUAGE_ID,
activity.languageCode.get(reader
.nextString())); // lanugage
// id
map.put(CommonUtils.KEY_SUBMISSION_RANK,
reader.nextString()); // rank
submissions.add(map);
reader.endArray();
}
reader.endArray();
}
reader.endObject();
reader.close();
} catch (IOException e) {
if (CommonUtils.isDebuggable) {
Log.e("GSON Parser",
"Error parsing data " + e.toString());
}
}
Collections.reverse(submissions);
adapter = new LatestSubmissionsAdapter(getSherlockActivity(),
submissions);
setListAdapter(adapter);
}
}
}
@Override
public void onStop() {
super.onStop();
if (submissionTask != null
&& submissionTask.getStatus() != AsyncTask.Status.FINISHED) {
submissionTask.cancel(true);
}
}
}
我不知道这是怎么发生的。我在其他片段中使用了几乎相同的类型代码,它们工作得很好。只有两个片段(包括此片段)会遇到此问题。您需要在
doInBackground
中读取输入流的全部内容。您现在要做的就是在doInBackground
中打开连接,并获取结果的读取器。但是,您试图在主线程上执行的onPostExecute
中实际读取网络数据
protected class GetSubmissionsListTask extends
AsyncTask<String, Void, ArrayList<HashMap<String, String>>> {
@Override
protected ArrayList<HashMap<String, String>> doInBackground(String... params) {
InputStreamReader isr = new JSONDownloader().getJSONStringFromUrl(params[0]);
ArrayList<HashMap<String, String>> result = null;
if (isr != null) {
result = new ArrayList<HashMap<String, String>>();
MainActivity activity = (MainActivity) getSherlockActivity();
JsonReader reader = new JsonReader(isr);
try {
reader.beginObject();
reader.nextName(); // name
reader.skipValue();
reader.nextName(); // uname
reader.skipValue();
String subs = reader.nextName(); // subs
if (subs.equals(CommonUtils.KEY_SUBMISSION)) {
reader.beginArray();
while (reader.hasNext()) {
HashMap<String, String> map = new HashMap<String, String>();
reader.beginArray();
reader.skipValue(); // submission id
String txt = "Latest problem";
Problems obj = MainActivity.problems.get(reader
.nextInt());
if (obj != null) {
txt = obj.getProblemsInfo();
}
map.put(CommonUtils.KEY_PROBLEM_ID, txt);
Verdict verdict = activity.verdicts.get(reader
.nextString()); // verdict id
map.put(CommonUtils.KEY_VERDICT_COLOR,
verdict.verdictColorHex);
map.put(CommonUtils.KEY_VERDICT_ID, verdict.name);
Double execTime = reader.nextDouble() / 1000; // execution
// time
map.put(CommonUtils.KEY_RUNTIME,
execTime.toString() + "s");
reader.skipValue(); // submission time
map.put(CommonUtils.KEY_LANGUAGE_ID,
activity.languageCode.get(reader
.nextString())); // lanugage
// id
map.put(CommonUtils.KEY_SUBMISSION_RANK,
reader.nextString()); // rank
result.add(map);
reader.endArray();
}
reader.endArray();
}
reader.endObject();
} catch (IOException e) {
if (CommonUtils.isDebuggable) {
Log.e("GSON Parser",
"Error parsing data " + e.toString());
}
result = null;
} finally {
reader.close(); // always need to close, even after an exception
}
}
if (result != null) Collections.reverse(result);
return result;
}
@Override
protected void onPostExecute(ArrayList<HashMap<String, String>> result) {
if (result != null) {
submissions = result; // do you still need this?
adapter = new LatestSubmissionsAdapter(getSherlockActivity(),
result);
setListAdapter(adapter);
}
}
}
受保护类GetSubmissionsListTask扩展
异步任务{
@凌驾
受保护的ArrayList doInBackground(字符串…参数){
InputStreamReader isr=new JSONDownloader().getJSONStringFromUrl(参数[0]);
ArrayList结果=null;
如果(isr!=null){
结果=新的ArrayList();
MainActivity活动=(MainActivity)getSherlockActivity();
JsonReader=新的JsonReader(isr);
试一试{
reader.beginObject();
reader.nextName();//名称
reader.skipValue();
reader.nextName();//uname
reader.skipValue();
String subs=reader.nextName();//subs
if(子类等于(通用密钥提交)){
reader.beginArray();
while(reader.hasNext()){
HashMap=newHashMap();
reader.beginArray();
reader.skipValue();//提交id
String txt=“最新问题”;
Problems obj=MainActivity.Problems.get(读卡器
.nextInt());
如果(obj!=null){
txt=obj.getProblemsInfo();
}
map.put(CommonUtils.KEY\u PROBLEM\u ID,txt);
判定=activity.verdicts.get(读卡器
.nextString());//裁决id
地图放置(CommonUtils.KEY\u裁决\u颜色,
判决书;判决书;
map.put(CommonUtils.KEY\u-VERDICT\u-ID,VERDICT.name);
Double execTime=reader.nextDouble()/1000;//执行
//时间
map.put(CommonUtils.KEY_运行时,
toString()+“s”);
reader.skipValue();//提交时间
map.put(CommonUtils.KEY\u语言\u ID,
activity.languageCode.get(读卡器
.nextString());//lanugage
//身份证
地图放置(CommonUtils.KEY\u提交\u排名,
reader.nextString());//秩
结果:添加(map);
reader.endArray();
}
reader.endArray();
}
reader.endObject();
}捕获(IOE异常){
if(CommonUtils.isdebugable){
Log.e(“GSON解析器”,
“分析数据时出错”+e.toString());
}
结果=空;
}最后{
reader.close();//始终需要关闭,即使在发生异常后也是如此
}
}
if(result!=null)集合。反转(result);
返回结果;
}
@凌驾
受保护的void onPostExecute(ArrayList结果){
如果(结果!=null){
submissions=result;//您还需要这个吗?
适配器=新的最新提交适配器(getSherlockActivity(),
结果);
setListAdapter(适配器);
}
}
}
您需要在doInBackground
中读取整个输入流。您现在要做的就是在doInBackground
中打开连接,并获取结果的读取器。但是,您试图在主线程上执行的onPostExecute
中实际读取网络数据
protected class GetSubmissionsListTask extends
AsyncTask<String, Void, ArrayList<HashMap<String, String>>> {
@Override
protected ArrayList<HashMap<String, String>> doInBackground(String... params) {
InputStreamReader isr = new JSONDownloader().getJSONStringFromUrl(params[0]);
ArrayList<HashMap<String, String>> result = null;
if (isr != null) {
result = new ArrayList<HashMap<String, String>>();
MainActivity activity = (MainActivity) getSherlockActivity();
JsonReader reader = new JsonReader(isr);
try {
reader.beginObject();
reader.nextName(); // name
reader.skipValue();
reader.nextName(); // uname
reader.skipValue();
String subs = reader.nextName(); // subs
if (subs.equals(CommonUtils.KEY_SUBMISSION)) {
reader.beginArray();
while (reader.hasNext()) {
HashMap<String, String> map = new HashMap<String, String>();
reader.beginArray();
reader.skipValue(); // submission id
String txt = "Latest problem";
Problems obj = MainActivity.problems.get(reader
.nextInt());
if (obj != null) {
txt = obj.getProblemsInfo();
}
map.put(CommonUtils.KEY_PROBLEM_ID, txt);
Verdict verdict = activity.verdicts.get(reader
.nextString()); // verdict id
map.put(CommonUtils.KEY_VERDICT_COLOR,
verdict.verdictColorHex);
map.put(CommonUtils.KEY_VERDICT_ID, verdict.name);
Double execTime = reader.nextDouble() / 1000; // execution
// time
map.put(CommonUtils.KEY_RUNTIME,
execTime.toString() + "s");
reader.skipValue(); // submission time
map.put(CommonUtils.KEY_LANGUAGE_ID,
activity.languageCode.get(reader
.nextString())); // lanugage
// id
map.put(CommonUtils.KEY_SUBMISSION_RANK,
reader.nextString()); // rank
result.add(map);
reader.endArray();
}
reader.endArray();
}
reader.endObject();
} catch (IOException e) {
if (CommonUtils.isDebuggable) {
Log.e("GSON Parser",
"Error parsing data " + e.toString());
}
result = null;
} finally {
reader.close(); // always need to close, even after an exception
}
}
if (result != null) Collections.reverse(result);
return result;
}
@Override
protected void onPostExecute(ArrayList<HashMap<String, String>> result) {
if (result != null) {
submissions = result; // do you still need this?
adapter = new LatestSubmissionsAdapter(getSherlockActivity(),
result);
setListAdapter(adapter);
}
}
}
受保护类GetSubmissionsListTask扩展
异步任务{
@凌驾
受保护的ArrayList doInBackground(字符串…参数){
InputStreamReader isr=new JSONDownloader().getJSONStringFromUrl(参数[0]);
ArrayList结果=null;
如果(isr!=null){
结果=新的ArrayList();
MainActivity活动=(MainActivity)getSherlockActivity();
JsonReader=新的JsonReader(isr);
试一试{
reader.beginObject();
reader.nextName();//名称
reader.skipValue();
reader.nextName();//uname
reader.skipValue();
String subs=reader.nextName();//subs
if(子类等于(通用密钥提交)){
reader.beginArray();
while(reader.hasNext()){
HashMap=newHashMap();
reader.beginArray();
reader.skipValue();//提交id
String txt=“最新问题”;
Problems obj=MainActivity.Problems.get(读卡器
.nextInt());
如果(obj!=null){
txt=obj.getProblemsInfo();
}
地图放置(通用)