0

私のアプリにはウィジェットがあります。HttpURLConnection を使用してコンテンツをダウンロードします (15 分ごとに自動ダウンロード)。通常、コンテンツのダウンロードには 10 秒かかります。

問題は、アプリの使用中に、この更新操作がバックグラウンドで進行している間にフリーズ/ハングすることです。ウィジェット クラスの updateAppWidget メソッドから handler.postDelayed を使用しています。バックグラウンド スレッドを使用しているにもかかわらず、アプリが一時的にフリーズします。多分 httpConn.connect(); だと思いました。問題になる可能性があり、DefaultHttpClient を使用しました。それでも同じ凍結効果。

誰かがこの問題についての洞察を提供してもらえますか?

ありがとう...

このハンドラを使用してウィジェット クラスから...

ハンドラー handler = new Handler();

handler.postDelayed(新しい Runnable() {

   public void run() {

    //download and update widget UI here.....   

   }

}、1000);

private String download1(String urlString) {

InputStream in = null;
byte[] data = null;
URLConnection conn = null;
try
 {
    URL url = new URL(urlString);
    conn = url.openConnection();

    if ((conn instanceof HttpURLConnection))
    {
        HttpURLConnection httpConn = (HttpURLConnection) conn;
        httpConn.setConnectTimeout(30000);
        httpConn.setReadTimeout(30000);
        httpConn.setAllowUserInteraction(false);
        httpConn.setInstanceFollowRedirects(true);
        httpConn.setRequestMethod("GET");
        httpConn.connect();

        if (httpConn.getResponseCode() == HttpURLConnection.HTTP_OK)
        {
            in = httpConn.getInputStream();
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            int c;
            while((c = in.read()) > -1){
                        baos.write(c);
        }
                    data = baos.toByteArray();
                    baos.close();
                    in.close();
                    String str = new String(data);
                    System.out.println(str);
                    httpConn.disconnect();
                    ((HttpURLConnection) conn).disconnect();
                    return str;
        }
        else
            {
                    httpConn.disconnect();
                    ((HttpURLConnection) conn).disconnect();
            return("Error: Invalid data");
    }


    }
}
catch (Exception ex)
{
    Log.e("TAG",ex.getMessage().toString());
    return("Error: No connection");
}
finally
{
    try
    {
        if (conn != null)
        {
            conn = null;
        }
        if (in != null)
        {
            in.close();
            in = null;
        }

    }catch(IOException ex)
    {
        return("Error: "+ex.getMessage());
    }
}
return null;

}

4

1 に答える 1

0

を使用するhandler.postDelayedと、Runnable投稿したものがUIスレッドで実行されます。UIスレッドからネットワークアクティビティを取得するには、(または、、、など)をThread作成する必要があります。AsyncTaskScheduledThreadPoolExecutor

コードを見ずに、コードを再構築する方法について具体的なアドバイスを提供するのは困難です。重要なことは、aHandlerがUIスレッドから作業を移動しないことです。実際、これは通常、正反対の目的で使用されます。つまり、バックグラウンドスレッドがUIスレッドで何かを実行する方法として使用されます。

于 2012-11-20T05:23:35.927 に答える