2012-01-06 54 views
3

这是从this post's Question继续。如何添加线程?

我无法计算如何从主UI线程添加单独的线程来完成从服务器收集数据的工作。我之前从来没有做过线程,我认为这个实例在我构建的类中使得它比我可以找到的任何示例更先进一点。

任何帮助和我班的修改稿将不胜感激。

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

你应该看看:HTTP://developer.android.com/reference/android/os/Handler.html这是管理出来的UI线程的最简单的方法和将结果或数据传输到UI线程。 – 2012-01-06 22:10:27

+0

Thnx。我做了,我不能想出一个方法来实现它到我的代码W/O编译错误。 @Jeremy D – CelticParser 2012-01-06 22:13:32

+0

@JeremyD我不知道。我认为http://developer.android.com/reference/android/os/AsyncTask.html实际上更容易。你总是保证在主线程中运行onPostExecute()。处理程序在创建它的线程中运行。 – AedonEtLIRA 2012-01-06 22:14:46

回答

7

我的回答你只需要使用一个​​

下面是关于如何使用它Tutorial

这里一个很好的教程是下载一个网页,返回的例子结果发送到主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。我做了尝试,我不能想出一种方法来实现它到我的代码W/O编译错误。你能编辑我有什么? @dmon – CelticParser 2012-01-06 22:17:26

+0

阅读关于主题的官方文档。这个很不错。 – davidcesarino 2012-01-06 22:26:08

+0

这就是为什么它的一个问题在这里:我不能得到它的工作/在我的班级正确实施它 - 阅读我的课程!日Thnx! @Manfred Moser – CelticParser 2012-01-06 22:32:46

3

使用AsyncTasks,卢克。

+0

我需要将创建方法中的变量字符串“p”传递给AsyncTask,这就是让我头疼的原因。任何想法或编辑我的课程?日Thnx – CelticParser 2012-01-06 22:29:02

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