0

AsyncTask を拡張するクラスがあります。

package Logic;


public class ReadConfig extends AsyncTask<String, Integer, String> {

 ProgressBar progressBar;
 Context context;
 URL url;
 FileInputStream config;
 static CreateApplicationFolder folders;
 File file;
 DocumentBuilderFactory dbf;
 DocumentBuilder db;
 Document doc;

 SharedPreferences prefs;
 File configFile;

 public ReadConfig(Context context, ProgressBar progressBar)
        throws ParserConfigurationException, SAXException, IOException {

    this.context = context;
    this.progressBar = progressBar;

    folders = new CreateApplicationFolder(context);
    dbf = DocumentBuilderFactory.newInstance();
    db = dbf.newDocumentBuilder();
    configFile = new File(folders.getPathToNode() + "/config.xml");

    prefs = PreferenceManager.getDefaultSharedPreferences(context);
}

protected void onPreExecute() {

    progressBar.incrementProgressBy(1);

}

@Override
protected String doInBackground(String... params) {
    android.os.Debug.waitForDebugger();
    int i;

    if (!configFile.exists()) {
        sleep();
        return "noConfig";
    } else {
        try {
            doc = db.parse(configFile);
        } catch (SAXException e2) {
            Log.e("SAX: ", e2.getMessage());
        } catch (IOException e2) {
            Log.e("IO: ", e2.getMessage());
        }
        doc.getDocumentElement().normalize();

        Log.i("ROOT NODE: ", doc.getDocumentElement().getNodeName());

        NodeList listOfMail = doc.getElementsByTagName("mail");

        int totalMail = listOfMail.getLength();
        Log.i("LENGTH: ", Integer.toString(totalMail));

        for (i = 0; i < totalMail; i++) {

            Node firstMailSetting = listOfMail.item(i);
            Element e = (Element) firstMailSetting;

            if (i == 0) {

                putSharedPrefs("host", getTagValue("host", e));
                putSharedPrefs("mail", getTagValue("account", e));
                putSharedPrefs("port", getTagValue("port", e));
                putSharedPrefs("pw", getTagValue("password", e));
            } else if (i == 1) {
                putSharedPrefs("supportMail", getTagValue("account", e));
            } else if (i == 2) {
                putSharedPrefs("Tomail", getTagValue("account", e));
            }
            sleep();

        }
    }

    return "";
}

protected void onPostExecute(String result) {

    if (result.equals("noConfig")) {
        Toast.makeText(context, "No Config file was found..",
                Toast.LENGTH_LONG).show();
        Intent mainIntent = new Intent(context, MAIN.class);
        context.startActivity(mainIntent);
    } else {
        Intent mainIntent = new Intent(context, MAIN.class);
        context.startActivity(mainIntent);
    }
}

private String getTagValue(String sTag, Element eElement) {
    try {
        NodeList nlList = eElement.getElementsByTagName(sTag).item(0)
                .getChildNodes();
        Node nValue = (Node) nlList.item(0);
        return nValue.getNodeValue();
    } catch (Exception e) {
        return "";
    }

}

public void putSharedPrefs(String tag, String value) {
    SharedPreferences.Editor prefEditor = prefs.edit();
    prefEditor.putString(tag, value);
    prefEditor.commit();
}

public void sleep() {
    for (int j = 0; j < 1; j++) {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e1) {
            e1.printStackTrace();
        }
    }
}

}

「問題」は、次のコード行で発生します。

if (!configFile.exists()) {
        sleep();
        return "noConfig";

onPostExecuteこれにより、メソッドに「noConfig」が返され、次のように表示されToastます。

protected void onPostExecute(String result) {

    if (result.equals("noConfig")) {
        Toast.makeText(context, "No Config file was found..",
                Toast.LENGTH_LONG).show();
        Intent mainIntent = new Intent(context, MAIN.class);
        context.startActivity(mainIntent);
    } else {
        Intent mainIntent = new Intent(context, MAIN.class);
        context.startActivity(mainIntent);
    }
}

このコードは Samsung S3 で動作しますが、HTC の欲望でテストすると、画面が黒くなりToast、新しいActivity. エラーも例外もありません。何か案は?

編集

AsyncTask は私のスプラッシュ画面から呼び出されています:

try {
        new ReadConfig(Splash.this, pd).execute("");
    } catch (ParserConfigurationException e) {
        Log.e("Parser: ", e.getMessage());
    } catch (SAXException e) {
        Log.e("Sax: ", e.getMessage());
    } catch (IOException e) {
        Log.e("IO: ", e.getMessage()); 
    }

pdオブジェクトはProgressDialogmy からのものLayoutで、以下は基本的なフローです。

スプラッシュスクリーンの初期化。doInBackgroundメソッドで解析される xml ファイルからのいくつかの設定。構成ファイルが存在しない場合は、それに関するメッセージをトーストしてメイン アクティビティを開始します。

4

2 に答える 2

0

問題が携帯電話に関係していることを考えると、携帯電話の製造元は奇数を変更/いじる傾向があり、私が見ているのは次のとおりです。

削除してみてください: android.os.Debug.waitForDebugger();

また、sleep() が必要ですか

アクティビティが開始されないという特定の問題に焦点を当てて、試してみるかもしれません

Intent mainIntent = new Intent(context.getApplicationContext(), MAIN.class);
context.getApplicationContext().startActivity(mainIntent);

インテントの開始を処理する方法についてのあいまいさを取り除くため。非同期タスクからではなく、アクティビティ内からメソッドを呼び出してこれを処理することもできます。

于 2012-08-29T11:47:14.097 に答える
0

あなたのラインで

new Intent(context, this.class);

this.class は、アクティビティではないReadConfig クラスを表していますが、これは奇妙です。アクティビティからこのコードを取得しましたか (内部クラスであった可能性がありますか?)

あなたはに変更しようとする必要がありthis.classますWhateverActivity.class

于 2012-08-29T11:26:58.903 に答える