我的Android应用程序跳过部分代码

时间:2014-09-24 15:20:48

标签: android string navigation-drawer

在主题中我的应用程序跳过代码。不要问为什么我使用线程,它也发生在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"
    />

2 个答案:

答案 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中多线程的更多信息。