2012-01-06 2 views
3

Продолжение: this post's Question.Как добавить тему?

Я не могу понять, как добавить отдельный поток из основного потока пользовательского интерфейса, чтобы выполнить сбор данных с сервера. Я никогда не делал нити раньше, и я думаю, что этот экземпляр в моем построенном классе делает его немного более продвинутым, чем любой из примеров, которые я могу найти.

Любая помощь и опубликованная ревизия моего класса будут оценены.

Thank_you!

@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)); 
    } 

Смотрите мой ответ ниже

+1

Вы должны смотреть по адресу: //developer.android.com/reference/android/os/Handler.html Это самый простой способ управления из потоков пользовательского интерфейса и передавать результаты или данные в поток пользовательского интерфейса. –

+0

Thnx. Я сделал, и я не могу понять, как реализовать его в моем коде без ошибок компиляции. @Jeremy D – CelticParser

+0

@JeremyD я не знаю. Я думаю, что http://developer.android.com/reference/android/os/AsyncTask.html на самом деле проще. Вы всегда гарантированно выполняете onPostExecute() в основном потоке. Обработчик работает в потоке, который его создал. – AedonEtLIRA

ответ

7

Вы должны просто использовать AsyncTask

Вот хороший учебник о том, как использовать его Tutorial

Вот пример загрузки веб-страницы и возврата результаты в основной пользовательский интерфейс.

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, Luke.

+0

Мне нужно передать переменную строку «p» из метода create в AsyncTask, и это то, что дает мне головную боль. Любые идеи или редактирование моего класса? Thnx – CelticParser

2

Я бы использовал расширение AsyncTask. Вот пример:

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(); 
    } 
Смежные вопросы