2012-01-06 10 views
3

これはthis post's Questionから続きます。スレッドを追加するにはどうすればよいですか?

サーバーからデータを収集する作業を行うために、メインのUIスレッドから別のスレッドを追加する方法がわかりません。私は前にスレッドを実行したことがないし、私の構築クラスのこのインスタンスは、私が見つけることができる例のいずれかを少し高度にすると思う。

私の授業の助けと投稿された改訂版は高く評価されます。

ありがとうございました!

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

     Bundle extras = getIntent().getExtras(); 
     setContentView(R.layout.list_view2); 

     /** 
     * Get the query string from last activity and pass it to this 
     * activity----------------------------------------------------- 
     */ 
     String p = null; 
     if (extras != null) { 
      p = extras.getString(PHP_KEY);   
     } 
     loadQuery(p); 
    } 

    void loadQuery(String p) { 

     String qO = getIntent().getStringExtra("QUERY_ORDER"); 

     ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 
     // http post 
     try { 

      HttpClient httpclient = new DefaultHttpClient(); 
      HttpPost httppost = new HttpPost("http://10.0.2.2/App/php/" + 
      p + qO + ".php"); 

      httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
      HttpResponse response = httpclient.execute(httppost); 
      HttpEntity entity = response.getEntity(); 
      is = entity.getContent(); 

     } catch (Exception e) { 
      Log.e("log_tag", "Error in http connection " + e.toString()); 
     } 

     // convert response to string 
     try { 
      BufferedReader reader = new BufferedReader(new InputStreamReader(
        is, "iso-8859-1"), 8); 
      sb = new StringBuilder(); 
      sb.append(reader.readLine() + "\n"); 

      String line = "0"; 
      while ((line = reader.readLine()) != null) { 
       sb.append(line + "\n"); 
      } 

      is.close(); 
      result = sb.toString(); 

     } catch (Exception e) { 
      Log.e("log_tag", "Error converting result " + e.toString()); 
     } 

     setListAdapter(new QueryAdapter(this, result)); 
    } 

ここでここでTutorial

を使用する方法についての良いチュートリアルがある

+1

:ここではサンプルです//developer.android.com/reference/android/os/Handler.htmlそれは、UIスレッドの外に管理するための最も簡単な方法で、結果やデータをUIスレッドに転送します。 –

+0

Thnx。私はそれを私のコードにコンパイルエラーなしで実装する方法を理解していません。 @ジェレミーD – CelticParser

+0

@ジェレミーD私は知らない。私はhttp://developer.android.com/reference/android/os/AsyncTask.htmlが実際に簡単だと思います。あなたは常にメインスレッドでonPostExecute()を実行することが保証されています。ハンドラはそれを作成したスレッドで実行されます。 – AedonEtLIRA

答えて

7

以下の私の答えはあなたが単に​​

を使用する必要があります参照してくださいには、Webページをダウンロードして返すの一例です結果をメインUIに表示します。

private class DownloadWebPageTask extends AsyncTask<String, Void, String> { 
    @Override 
    protected String doInBackground(String... urls) { 
     String response = ""; 
     for (String url : urls) { 
      DefaultHttpClient client = new DefaultHttpClient(); 
      HttpGet httpGet = new HttpGet(url); 
      try { 
       HttpResponse execute = client.execute(httpGet); 
       InputStream content = execute.getEntity().getContent(); 

       BufferedReader buffer = new BufferedReader(
         new InputStreamReader(content)); 
       String s = ""; 
       while ((s = buffer.readLine()) != null) { 
        response += s; 
       } 

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

    @Override 
    protected void onPostExecute(String result) { 
     textView.setText(result); 
    } 
} 
+0

Thnx。私は試してみましたが、コンパイルエラーを起こさずにコードを実装する方法を説明することはできません。私が持っているものを編集できますか? @dmon – CelticParser

+0

スレッドに関する公式文書を読んでください。かなりいい。 – davidcesarino

+0

それはなぜここに質問:私はそれが私のクラスで正しく動作する/実装することができません - 私のクラスを読む! Thnx! @Manfred Moser – CelticParser

3

使用AsyncTasks、ルーク。

+0

私は変数の文字列 "p"をcreateメソッドからAsyncTaskに渡す必要があります。これが私に頭痛を与えています。任意のアイデアや私のクラスを編集する?? Thnx – CelticParser

2

私はAsyncTaskの拡張を使用します。ます。http:あなたが見なければならない

public TestSync extends AsyncTask<Void, Integer, Integer> { 
    TextView mTv = null; 
    String mURL; 
    public TestSync(TextView tv, String url) { 
     mTv = tv; 
     mURL = url; 
    } 

    @Override public Void doInBackground(Void... voids) { 
     int count = 0; 
     URL url = null; 
     BufferedReader br = null; 
     try { 
      url = new URL(mURL); 
      br = new BufferedReader(new InputStreamReader(url.openStream)); 
      String log = null; 

      while ((log = br.readLine()) != null) { 
       Log.d("Testo", log); 
       count++; 
       publishProgress(new int[] {count}); 
      } 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
      try { 
       if (is != null) 
        is.close(); 
      } catch (Exception e) { /* eat*/ } 
     } 

     return count; 
    } 

    @Override public void onProgressUpdate(Integer... vals) { 
     mTv.setText(vals[0]); 
    } 

    @Override public void onPostExecute(Integer inte) { 
     Toast.makeText(context, "We read " + inte + " lines from the url.", Toast.LENGTH_LONG).show(); 
    } 
} 
1
....loadQuery(); 
    } 

    void loadQuery() { 

     new Thread(new Runnable() { 

      public void run() { 

       String qO = getIntent().getStringExtra("QUERY_ORDER"); 
       String php = getIntent().getStringExtra("PHP_KEY"); 

       ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(); 
       // http post 
       try { 
        HttpClient httpclient = new DefaultHttpClient(); 
        HttpPost httppost = new HttpPost(
          "http://10.0.2.2/Andaero/php/" + php + qO + ".php"); 

        Log.e("log_tag", "Fetched " + php + qO + ".php"); 

        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
        HttpResponse response = httpclient.execute(httppost); 
        HttpEntity entity = response.getEntity(); 
        is = entity.getContent(); 

       } catch (Exception e) { 

        Log.e("log_tag", "Error in http connection " + e.toString()); 
       } 

       // convert response to string 
       try { 
        BufferedReader reader = new BufferedReader(
          new InputStreamReader(is, "iso-8859-1"), 8); 
        sb = new StringBuilder(); 
        sb.append(reader.readLine() + "\n"); 

        String line = "0"; 
        while ((line = reader.readLine()) != null) { 
         sb.append(line + "\n"); 
        } 

        is.close(); 
        result = sb.toString(); 

       } catch (Exception e) { 
        Log.e("log_tag", "Error converting result " + e.toString()); 
       } 

      } 

     }).start(); 
    } 
関連する問題