1

json リソースによって毎分更新されるウィジェットを開発しようとしています。私の問題は、それをジェリービーンで起動しようとするとクラッシュすることですが、ジンジャーブレッドでは機能します。

ここで、すべてのインターネット接続をメインスレッドに移動する必要があることがわかりましたよね? 現時点では、HttpRequest というクラスがあります。

public class HttpRequest {    
    private String url;

    public HttpRequest(String url)
    {       
        this.url = url;
    }

    public String GetContent() throws ClientProtocolException, IOException
    {
        HttpClient client = new DefaultHttpClient();
        HttpGet request = new HttpGet(url);
        HttpResponse response = client.execute(request);

        String html = "";
        InputStream in = response.getEntity().getContent();
        BufferedReader reader = new BufferedReader(new InputStreamReader(in));
        StringBuilder str = new StringBuilder();
        String line = null;
        while((line = reader.readLine()) != null)
        {
            str.append(line);
        }
        in.close();
        html = str.toString();
        return html;
    }
}

毎分、WidgetProvider クラスのメソッドである updateAppWidget() が呼び出されます。内部 updateAppWidget() があります:

HttpRequest r = new HttpRequest("http://www.hwlogos.com/test.json");
remoteViews.setTextViewText(R.id.ip, r.GetContent());

急勾配でそれを解決する方法を教えてもらえますか? ありがとう

4

3 に答える 3

2

提案されているように、AsyncTaskが最適です。コードを次のように変更します。

private class HttpRequestTask extends AsyncTask<Context, Void, String> {

    private Context context;

    protected String doInBackground(Context... contextParam) {
        context = contextParam[0];
        HttpClient client = new DefaultHttpClient();
        HttpGet request = new HttpGet("http://www.hwlogos.com/test.json");
        HttpResponse response = client.execute(request);

        String html = "";
        InputStream in = response.getEntity().getContent();
        BufferedReader reader = new BufferedReader(new InputStreamReader(in));
        StringBuilder str = new StringBuilder();
        String line = null;
        while((line = reader.readLine()) != null)
        {
            str.append(line);
        }
        in.close();
        html = str.toString();
        return html;
     }

     protected void onPostExecute(String html) {
         AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
         RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widget);
         remoteViews.setTextViewText(R.id.ip, html);
         appWidgetManager.updateAppWidget(new ComponentName(context, WidgetProvider .class), remoteViews);
     }
}

アプリ ウィジェットを更新するために必要な追加作業を行うonPostExecuteのコードに注意してください。

次に、次のように非同期タスクを開始します。

 new HttpRequestTask().execute(context);
于 2012-10-13T14:48:34.037 に答える
0

ネットワーク接続をメイン スレッドからバックグラウンド スレッドに移動する必要があります。メイン スレッドでネットワークを使用すると、以降のバージョンの Android でアプリがクラッシュします。

最も簡単な解決策は、 を使用するAsyncTaskことです。これは、別のスレッド (ネットワーク フェッチを行う) でいくつかの作業を行い、それが完了したときにメイン スレッドで後続の作業を実行できるようにします。

この投稿に例があり、SO または Google で他の多くの例を見つけることができます。

于 2012-10-13T14:43:34.417 に答える
0

次のコードから関数を呼び出します[スレッドから]

ステップ1 :

この2行の代わりに

HttpRequest r = new HttpRequest("http://www.hwlogos.com/test.json");
remoteViews.setTextViewText(R.id.ip, r.GetContent());

次のコード行を呼び出します。

    Thread thread = new Thread()
    {
      @Override
      public void run() {
          try {

            // CALL YOUR FUNCTION FROM HERE
            HttpRequest r = new HttpRequest("http://www.hwlogos.com/test.json");            
            remoteViews.setTextViewText(R.id.ip, r.GetContent());

          } catch (Exception e) {
              e.printStackTrace();
          }
      }
    };

thread.start();

ステップ2:

上記の機能がうまくいかない場合

この参照リンクを使用してください。

これがうまくいくことを願っています。ありがとう。

于 2012-10-13T15:10:41.530 に答える