HTC One mini崩溃了XML解析器

时间:2015-03-02 14:14:41

标签: android xml android-asynctask

设备:HTC One mini

操作系统版本:4.3

问题:AsyncTask XML阅读器在没有触发UncaughtExceptionHandler

的情况下崩溃

我制作了一个简单的AsyncTask XML阅读器/解析器,可以在大多数设备(OS 2.2及更早版本)上运行,但不能在我的HTC One mini(OS 4.3)上运行。当我尝试运行AsyncTask时,它总是在doInBackground的代码中崩溃。有时它在url.openConnection()上,有时在httpurlconection.getInputStream(),有时在if(stream!= null)stream.close();,有时在代码中的其他随机点。在极少数情况下,AsyncTask可以自行完成,但无论如何都会在下一个请求中崩溃。

主循环只是等待AsyncTask进程停止,通过在while中运行volatile boolean(XMLreaderAsyncTask.parsingnotComplete);

踢球者是我使用DefaultUncaughtExceptionHandler来编写所有崩溃的TXT文件报告,但是对于这种类型的崩溃它不起作用/触发。如果我通过超出数组的范围触发它,它的工作正常,但不是因为导致AsyncTask XML读取器崩溃的原因。

public static Thread.UncaughtExceptionHandler androidDefaultUEH;

@Override
protected void onCreate(Bundle savedInstanceState)
{
        super.onCreate(savedInstanceState);
...

androidDefaultUEH = Thread.getDefaultUncaughtExceptionHandler();
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler()
{
    Write a TXT report file
androidDefaultUEH.uncaughtException(paramThread, paramThrowable);
}
...
}

我无法通过eclipse来检测插入的手机,所以我无法获得LogCat报告。充其量,我通过写入SharedPreferences

来设置检查点标志

编辑1: 调用XML AsyncTask

HandleXMLbackground XMLURL2=new HandleXMLbackground(contextvar,"http:/www.demowebsite.com/pageurloutput.xml");
XMLURL2.execute();
while(XMLURL2.parsingnotComplete);
String x=XMLURL2.xml_unparsed; 

AsyncTask代码

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import android.content.Context;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.os.AsyncTask;
import android.util.Xml;

public class HandleXMLbackground extends AsyncTask<String, Void, Void>
{
    public volatile boolean parsingnotComplete = true;
    private String urlString = "";
    static Context contxtxml;

    public String xml_unparsed="";

    public HandleXMLbackground(Context c,String url)
    {
        contxtxml=c;
        urlString=url;
    }


    public void parse(InputStream in)
    {
        LogLastAction5("parse start "+urlString);

            try
            {
                    XmlPullParser parser = Xml.newPullParser();
                    parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
                    parser.setInput(in, null);
                    parser.nextTag();

                    //Parsing happens here

            }
            catch (XmlPullParserException e)
            {
                LogLastAction5("xml F1 "+urlString+" "+e.getMessage()+" "+e.toString());
        }
            catch (IOException e)
            {
                LogLastAction5("xml F2 "+urlString+" "+e.getMessage()+" "+e.toString());
        }
    }

    @Override
    protected Void doInBackground(String... urls)
    {
        parsingnotComplete = true;
        LogLastAction5("start "+urlString);

        try
        {
            URL url = new URL(urlString);
            HttpURLConnection universalconn = (HttpURLConnection) url.openConnection();
            universalconn.setConnectTimeout(7000);//ms
            universalconn.setReadTimeout(8000);//ms
            universalconn.setRequestMethod("GET");
            universalconn.setDoInput(true);
            universalconn.connect();
            InputStream stream2 = universalconn.getInputStream();
            parse(stream2);
            if(stream2!=null)stream2.close();
            universalconn.disconnect();
        }
        catch (IOException e)
        {
            LogLastAction5("fail 1 "+urlString+" "+e.getMessage()+" "+e.toString());
        }

        parsingnotComplete = false;
        return null;
    }

    protected static void LogLastAction5(String tx)
    {
         SharedPreferences settings1 = contxtxml.getSharedPreferences("com.myapp.stuff", Context.MODE_PRIVATE);
         SharedPreferences.Editor seditor = settings1.edit();
         seditor.putString("LastAct5","xml "+tx);
         seditor.apply();
    }
}

编辑2: 我尝试将该类设置为Activity的私有类,并添加了onPostExecute。在这些命令中,HTC One mini在9次中仍然9次崩溃:

1 universalconn.setRequestMethod("GET");
2 universalconn.connect();
3 stream2 = universalconn.getInputStream();
4 universalconn.setConnectTimeout(7000);//ms
5 stream2 = universalconn.getInputStream();
6 stream2 = universalconn.getInputStream();
7 universalconn.setConnectTimeout(7000);//ms
8 universalconn.setDoInput(true);
9 universalconn.setDoInput(true);

编辑4: 找到了如何让手机进入开发者模式,所以现在Eclipse显示了logcat报告。 整体报告发布时间过长,但以2条红线结束。 这会有帮助吗?

03-03 16:14:06.723: E/dalvikvm(20345): threadid=13: stuck on threadid=1, giving up
03-03 16:14:06.723: A/libc(20345): Fatal signal 16 (SIGSTKFLT) at 0x00004f79 (code=-6), thread 20345 (evelads.navimon)

我也有&#34; threadid = 13&#34; be&#34; threadid = 11&#34;

编辑5:在不同设备上测试代码 模型代码工作正常:

Samsung Galaxy y gt-s5360 (Android OS 2.3.6)
Samsung GT-N8000 (Android OS 4.1.2)
Samsung GT-I5500 (Android OS 2.3.7)
HTC One V (Android OS 4.0.3)

模型代码在99.999%的时间内崩溃:

HTC One Mini (Android OS 4.2)
Cube Talk 7X U51GT-C4 (Android OS 4.2.2)

1 个答案:

答案 0 :(得分:0)

在仔细研究问题之后,我找到了解决方案here。显然,有些手机型号不喜欢连续不间断的循环,并认为它们是一种非同寻常的崩溃方案。

所以我的问题在于:

while(XMLURL2.parsingnotComplete);

我把它改成了这个,现在没有崩溃。

while(XMLURL2.parsingnotComplete)
{
    try
    {
        Thread.sleep(100);
    }
    catch (InterruptedException e){}
}