基本上,我试图运行一个秒计数器和一个水平计数器.每10秒我想要++级别.
但是那还没有实现,到目前为止我只是试图让秒显示但是我得到运行时异常和崩溃.
谷歌搜索我看到它,因为我试图从我的线程更新UI,这是不允许的.所以我想我将需要asyncTask,但我不知道如何用我简单的小程序做到这一点.请帮忙或给我一些替代方案......
package com.ryan1;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
public class main extends Activity {
int level = 1;
int seconds_running=0;
TextView the_seconds;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
the_seconds = (TextView) findViewById(R.id.textview_seconds);
Thread thread1 = new Thread(){
public void run(){
try {
sleep(1000); Log.d("RYAN", " RYAN ");
updated_secs();
} catch (Exception e) {
e.printStackTrace();
Log.d("RYAN", " "+e);
}
}
};
thread1.start();
}
public void updated_secs(){
seconds_running++;
the_seconds.setText(" "+seconds_running);
}
}
Run Code Online (Sandbox Code Playgroud) 我需要在循环中添加大量视图,而这个片段就是这样,应用程序还将有一个导航抽屉和操作栏,用户可以在其中执行操作.
所以我希望这个过程不会a)通过阻止用户来减慢app的速度,b)最好在后台线程中添加视图.
困境是我认为android不喜欢在非UI线程中添加视图,所以有最佳实践吗?我计划在片段视图中显示进度条视图对象,而其余视图是使用addView和相关计算生成的
有人可以向我解释为什么只有Android中的UI线程才能更新UI?为什么任何其他线程都无法更新UI?
我有应用程序,现在开始几个线程(如5 - 10)从不同的来源收集数据.
它们与主GUI线程分离,因此我感觉GUI中没有任何缓慢,我可以在后台线程工作时继续工作.太棒了
但现在我希望能够在主GUI中的QTableView中显示结果.数据是它们的字符串,它可以有10,000到100,000个结果,在QTableView中可能有多达100,000行.
我的问题是从线程更新主GUI中的表的最佳方法是什么,因此更新时TH GUI不会很慢或空闲.
我是初学者Android,我有一些困惑Android UI Thread.现在,我知道除了创建UI的线程之外没有任何线程可以修改它.
大.
这是Activity我的第一个Android应用程序,有点让我感到困惑.
public class NasaDailyImage extends Activity{
public ProgressDialog modalDialog = null;
//------------------------------------------------------------------------------
@Override
protected void onCreate(Bundle savedInstanceState){
//Instantiate progress dialog, skipping details.
Button b = //get reference to button
b.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
modalDialog.show(); // show modal
Toast.makeText(getApplicationContext(), "Getting feeds", 500).show();
new AsyncRetriever().execute(new IotdHandler()); // Get the feeds !!
}
});
}
//------------------------------------------------------------------------------
public synchronized void resetDisplay(boolean parseErrorOccured,
boolean imageErrorOccured,
IotdHandler newFeeds){
if(parseErrorOccured || imageErrorOccured){ …Run Code Online (Sandbox Code Playgroud) 我有 ViewGroup.addView() 方法的问题。我使用此代码向我的布局添加新视图:
TalbeLayout parent = (TableLayout)findViewById(R.id.this_does_not_matter);
parent.removeAllViews(); //this view group contains something at start
TextView tv = new TextView(this);
tv.setText("some text");
TableLayout.LayoutParams lp = new TableLayout.LayoutParams(TableLayout.LayoutParams.MATCH_PARENT, TableLayout.LayoutParams.WRAP_CONTENT);
tv.setLayoutParams(lp);
parent.addView(tv);
Run Code Online (Sandbox Code Playgroud)
之后我就看不到我的 TextView。不仅如此,parent.getChildCount() 返回正确的值(如果我尝试添加一个孩子,则为 1)。在父视图的 onClick() 方法中,我尝试获取 TextView 的宽度和高度,所有这些都等于 0。为 TableView 和父级调用 requestLayout()、invalidate() 和 measure(500, 50) 没有效果。我什至尝试在 view.post(Runnable) 的帮助下添加新视图,尽管此代码是在 UI 线程中执行的。
我糊涂了。我真的不明白会发生什么。有人可以解释我做错了什么吗?
一个有趣的时刻: setLayoutParams() 没有效果。如果我设置了宽度=500 和高度=50 的参数,在onClick 方法中,我会得到宽度=-1 和高度=-1 的参数。
添加 TableRow 后的代码:
TableLayout parent = (TalleLayout)findViewById(R.id.this_does_not_matter);
parent.removeAllViews(); //this view group contains something at start
TextView tv = new TextView(this);
tv.setText("some …Run Code Online (Sandbox Code Playgroud) public class AddStudentActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add_student);
}
public void add2(View view){
//create 3 editText , 1 Textview
EditText et_name, et_age;
RadioButton rb_male;
TextView tv_msg;
//bind with xml widget
et_name = (EditText)findViewById(R.id.et_name);
et_age = (EditText)findViewById(R.id.et_age);
rb_male = (RadioButton)findViewById(R.id.rb_male);
tv_msg = (TextView)findViewById(R.id.tv_msg);
//retrieve values
String name = et_name.getText().toString();
String age = et_age.getText().toString();
String gender = "";
if (rb_male.isChecked())
gender = "male";
else
gender = "female";
//call php
new AddStudent(this, tv_msg).execute(name, age, gender);
}
} …Run Code Online (Sandbox Code Playgroud) 我正在ondoInBackground内的方法中执行数据库操作。AsyncTaskAndroid
由于某种原因,UI该操作在 5-6 秒内被阻塞。
这对我来说没有任何意义, 中的操作doInBackground不应该在 中执行UI Thread,对吗?
这是我的代码:
private class CountItems extends AsyncTask<String, Void, Integer> {
private ProgressDialog dialog;
@Override
protected void onPreExecute() {
dialog = new ProgressDialog(context);
dialog.setCancelable(false);
dialog.setMessage(getString(R.string.asynTask_loading));
dialog.show();
}
@Override
protected Integer doInBackground(String... params) {
// This operation takes 5-6 seconds.
return app.databaseSession().getMyObjectDao().count(selectedProject, filter, null, false);
}
@Override
protected void onPostExecute(Integer result) {
counterTextView.setText(String.valueOf(result));
if (dialog.isShowing()) {
dialog.dismiss();
}
}
}
Run Code Online (Sandbox Code Playgroud)
我做了一个测试。如果我将 a 放在方法Thread.sleep()内部 …
我在Android Vital中收到一条警告,提示我的UI渲染时间太慢。
正如他们在重要页面上解释的那样:
冻结的UI框架:
每天会话的百分比,在此期间,用户体验超过0.1%的框架且渲染时间超过700毫秒。每日会话是指在设备上使用您的应用的一天。Google使用UI Toolkit框架收集应用程序渲染的每个帧的渲染时间,而不是直接使用OpenGL。学到更多
我不明白如何从这个问题开始。
我怀疑自己的活动,但似乎没有什么奇怪的。
android ui-thread android-anr-dialog google-console-developer android-rendering
我有一个包含 10000 条记录的 json,需要在 Flatlist 中显示。我正在使用工作正常的虚拟化列表。现在我有某些过滤器,单击后应过滤掉 json 并使用新数据重新渲染列表。我只是过滤掉数据。
const filters = foo1;
const largeList = [{ id:1, foo:'foo1',bar:10 },{id:2, foo:'foo1',bar:20} ...]
const filteredList = largeList.filter(l=>l.foo === filters && l.bar > 10);
Run Code Online (Sandbox Code Playgroud)
过滤器是动态的,这会滞后于我的应用程序,因为它会给 UI 线程带来压力。我已经使用了InteractionManager.runafterinteractions()但在这种情况下不起作用。如何在应用程序中执行如此昂贵的操作而不阻塞 UI 线程?
ui-thread ×10
android ×7
blocking ×1
c++ ×1
concurrency ×1
database ×1
java ×1
qtableview ×1
react-native ×1
toast ×1
views ×1