Re: Урок 80. Handler. Немного теории. Наглядный пример испо
Добавлено: 15 окт 2014, 15:27
Если например хендлер создать в новом потоке поток2 и передать ему сообщение из потока3, то хендлер будет выполнять команды из потока2 ?!
Добро пожаловать на форум сайта
http://forum.startandroid.ru/
Какая еще возможность? это все один мейн поток, код выполняется последовательно. Параллельность возникает между разными потоками.Bulvasaur писал(а):Добрый день!
Немного не понятно почему зависает приложение, когда начинает "закачивать" файлы? Вот оно заходит в цикл
for (int i = 1; i <= 10; i++)
потом одну секунду выполняет метод
// долгий процесс
downloadFile();
но потом-то должно выполнится это
// обновляем TextView
tvInfo.setText("Закачано файлов: " + i);
А оно не выполняется, а только пишется в лог. Почему основной процесс остается занятым, если он уже однократно выполнил downloadFile();
То есть, насколько я понимаю, только в течение одной секунды основной поток занят, а потом возникает возможность прорисовать экран, но этого не происходит, потому что поток чем-то занят. Так чем он получается занят?
Растолкуйте, пожалуйста.
Понятно, что код выполняется последовательно. Это и не понятно)doter.ua писал(а):Какая еще возможность? это все один мейн поток, код выполняется последовательно. Параллельность возникает между разными потоками.
Нужно глубоко покопаться в исходниках, чтобы понять всю суть. Но думаю просто View прорисовывается не сразу в ходе выполнения метода onClick() (ну и любого другого метода из ui потока), т.к. во время метода вы можете поменять кучу разных view, и при каждом таком изменении "рисовать" будет накладно.Bulvasaur писал(а):Ok. Задам вполне конкретный вопрос. Почему это tvInfo.setText("Закачано файлов: " + i); не может быть выполнено после этого downloadFile();? Ведь в данный конкретный момент перехода от одной строчки кода к следующей поток не занят. Или занят? Чем?
Спасибо. Что-то зашевелилось в голове. Не спроста этот хэндлер, в общем.klblk писал(а):Нужно глубоко покопаться в исходниках, чтобы понять всю суть. Но думаю просто View прорисовывается не сразу в ходе выполнения метода onClick() (ну и любого другого метода из ui потока), т.к. во время метода вы можете поменять кучу разных view, и при каждом таком изменении "рисовать" будет накладно.
Примерно так: Отработал метод onClick(), система проверила нужно или нет обновлять view, и если нужно обновляет.
Код: Выделить всё
public class MainActivity extends Activity {
private Button clickBtn;
private Button clickBtn2;
private ProgressDialog progressDialog;
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
progressDialog.dismiss();
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LinearLayout ll = new LinearLayout(this);
ll.setOrientation(LinearLayout.VERTICAL);
clickBtn = new Button(this);
clickBtn2=new Button(this);
ll.addView(clickBtn);
ll.addView(clickBtn2);
clickBtn.setText("Click me");
clickBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
processThread();
}
});
setContentView(ll);
clickBtn2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
runLongProcess();
}
});
}
private void processThread() {
progressDialog = ProgressDialog.show(MainActivity.this, "Wait", "Running loooong process...");
new Thread() {
public void run() {
runLongProcess();
handler.sendEmptyMessage(2);
}
}.start();
}
private void runLongProcess() {
try {
Thread.sleep(5*1000);
Log.e("MainActivity", "LongProcess");
clickBtn2.setText("Click me");
} catch (InterruptedException e) {
Log.e("MainActivity", e.getMessage());
}
}
Код: Выделить всё
package consulting.brick.wkbapka.p0801_handler;
import android.app.Activity;
import android.util.Log;
import android.os.Bundle;
import android.os.Handler;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Button;
import android.widget.TextView;
import android.view.View;
import java.util.concurrent.TimeUnit;
public class MainActivity extends Activity {
final String LOG_TAG = "myLog";
Handler h;
TextView tvInfo;
Button btnStart;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvInfo = (TextView) findViewById(R.id.tvInfo);
}
public void onСlick(View v) {
switch (v.getId()) {
case R.id.btnStart:
Thread t = new Thread(new Runnable() {
public void run() {
for (int i = 1; i <= 10; i++) {
downloadFile();
tvInfo.setText("Закачано файлов " + i);
Log.d(LOG_TAG, "Закачано файлов " + i);
}
}
});
break;
case R.id.btnTest:
Log.d(LOG_TAG,"test");
break;
default:
break;
}
}
void downloadFile() {
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
все, вопрос снят, забыл запустить поток