在主题中我的应用程序跳过代码。不要问为什么我使用线程,它也发生在try / catch中。经过几个小时的测试后,我发现它与.xml中的android.support.v4.widget.DrawerLayout有关。有谁知道这方面的解决方案?
public class MainActivity extends Activity {
private String[] drawerListViewItems = new String[]{"Test","Also test","Guess what","Another test"};
private ListView drawerListView;
String a="one";
int i=0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// get list items from strings.xml
// drawerListViewItems = getResources().getStringArray(R.array.items);
TextView lol = (TextView) findViewById (R.id.textView1);
lol.setText("#YOLO");
new Thread (new Runnable() { // This whole thread is skipped for no reason.
public void run() {
a="SWAG";
i++;
}
}).start();
lol.setText(a+" "+i);
// get ListView defined in activity_main.xml
drawerListView = (ListView) findViewById(R.id.left_drawer);
// Set the adapter for the list view
drawerListView.setAdapter(new ArrayAdapter<String>(this,
R.layout.drawer_listview_item, drawerListViewItems));
}
}
当然输出是&#34;一个0&#34;在我的应用程序中我希望它是&#34; SWAG 1&#34;我需要它在线程中。另外,不要问为什么我使用这样的字符串:)哦,还有.xml文件:
<android.support.v4.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/drawer_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- The main content view -->
<RelativeLayout
android:id="@+id/content_frame"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView android:text="TextView"
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<!-- The navigation drawer -->
<ListView android:id="@+id/left_drawer"
android:layout_width="240dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:choiceMode="singleChoice"
android:divider="#666"
android:dividerHeight="1dp"
android:background="#333"
android:paddingLeft="15sp"
android:paddingRight="15sp"
/>
答案 0 :(得分:1)
不会被跳过。您正在做出错误的假设ui线程正在等待您的线程完成其执行。快速解决方法是使用方法更新TextView
private void updateTextView() {
runOnUiThread(new Runnable() {
@Override
public void run() {
TextView lol = (TextView) findViewById (R.id.textView1);
lol.setText(a+" "+i);
}
});
}
在更新数据后在线程中调用此方法。另请注意,setText
必须在UI线程上运行
答案 1 :(得分:0)
不跳过该主题。您假设您的整个程序同步运行,而不是。编写它的方式,UI线程无法与您创建的线程正确通信。
当您的代码命中new Thread(...)
部分时,它将生成一个新线程并同时运行到UI线程。因此a
的值可能会或可能不会达到预期效果,具体取决于您的背景线程是否在setText()
之前或之后完成。
有多种与UI线程进行通信的方式。
使用Handler并将消息从后台线程发送回UI线程。
使用AsyncTask并在onPostExecute
按照其他答案中的建议使用runOnUIThread。
或者在你的情况下,不要产生另一个线程。
Here关于android中多线程的更多信息。