我正在研究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;
位于代码
答案 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.
}
}