我是Android新手,我正在尝试使用UI-Thread,所以我写了一个简单的测试活动.但我认为我误解了一些东西,因为点击按钮 - 应用程序不再响应
public class TestActivity extends Activity {
Button btn;
int i = 0;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btn = (Button)findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
runThread();
}
});
}
private void runThread(){
runOnUiThread (new Thread(new Runnable() {
public void run() {
while(i++ < 1000){
btn.setText("#"+i);
try {
Thread.sleep(300);
}
catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}));
}
}
Run Code Online (Sandbox Code Playgroud) 我试图在我的一个活动的onCreate()方法期间显示进度对话框,完成工作以填充线程中完成的屏幕,然后关闭进度对话框.
这是我的onCreateMethod()
dialog = new ProgressDialog(HeadlineBoard.this);
dialog.setMessage("Populating Headlines.....");
dialog.show();
populateTable();
Run Code Online (Sandbox Code Playgroud)
populateTable方法包含我的线程和解除对话框的代码,但由于某种原因.活动空白大约10秒(执行populateTable()工作),然后我看到屏幕.我从来没有看到对话框显示,任何想法?
这是populateTable()代码:
//Adds a row to the table for each headline passed in
private void populateTable() {
new Thread() {
@Override
public void run() {
//If there are stories, add them to the table
for (Parcelable currentHeadline : allHeadlines) {
addHeadlineToTable(currentHeadline);
}
try {
// code runs in a thread
runOnUiThread(new Runnable() {
@Override
public void run() {
dialog.dismiss();
}
});
} catch (final Exception ex) {
Log.i("---","Exception in thread"); …Run Code Online (Sandbox Code Playgroud) 我们的游戏引擎Cocos2d-x在其自己的非Java-UI线程上本机运行在android上.我们需要在Android UI线程上通过JNI从C++调用某些Java函数.
为了调用JNI-Functions,我们从这里使用JNIHelper.h/cpp: https://github.com/cocos2d/cocos2d-x/blob/v3/cocos/platform/android/jni/JniHelper.h https: //github.com/cocos2d/cocos2d-x/blob/v3/cocos/platform/android/jni/JniHelper.cpp
例如这个C++代码:
Cocos2d-x
理想情况下,我们希望所有这些调用都发生在Android UI线程上,并将std :: function作为参数传递,一旦函数调用完成,就会再次使用Cocos2d-x-thread上的返回值调用该参数.
调用函数的理想方式:
auto retVal = JniHelper::callStaticStringMethod("org/utils/Facebook",
"getFacebookTokenString");
Run Code Online (Sandbox Code Playgroud)
但是也有很多没有任何返回值的调用,所以对于那些在java线程上调用它们应该更容易.