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();
}
地图放置(通用)