Android线程 - 不适合我

时间:2013-08-06 11:41:01

标签: java android

我正在研究Android中使用线程的简单应用程序。我的应用程序中有以下代码。但这似乎没有用。

l = (RelativeLayout)findViewById(R.id.layout_main);
p = new LayoutParams(100, 100);
i = new ImageView(getApplicationContext());
i.setImageResource(R.drawable.bb);
i.setLayoutParams(p);
i.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
    if (running) {
        running = false;
    } else {
        new Thread(new Runnable() {
        @Override
        public void run() {
            while (running) {
                try {
                    Log.d("INFO", "Thread executing");
                    Thread.sleep(100);
                } catch (Exception e) {
                    running = false;
                }
            }
        }
        }).start();
    }

    return false;
}
});
l.addView(i);

即使是日志也没有打印。

编辑:running = false;位于代码

之前

3 个答案:

答案 0 :(得分:4)

永远不会到达记录日志的部分。如果running为真,则将其设置为false并且不执行else分支。如果它是假的,那么循环永远不会被执行。

您应该在else分支中将running设置为true。另请注意,running应该是volatile(如果还没有),以确保它不会在本地缓存for while循环。

答案 1 :(得分:1)

在android中的主线程上运行线程对于在如此低内存中的性能非常糟糕

检查这个并行完成工作的异步任务

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

  public void onClick(View view) {
    DownloadWebPageTask task = new DownloadWebPageTask();
    task.execute(new String[] { "http://www.vogella.de" });

  }

答案 2 :(得分:-1)

试试这个:

i.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        // Your code here.          
    }
}