2014-09-24 73 views
0

的一部分,因为在主题我的应用跳过代码。不要问我为什么要使用线程,它也发生在try/catch上。经过几个小时的测试,我发现它与.xml中的android.support.v4.widget.DrawerLayout有关。有谁知道这个解决方案?我的android应用跳过代码

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)); 

} 

}

当然输出为 “一个0” 在我的应用程序。我希望它是“SWAG 1”,我需要它在线程中。另外,不要问我为什么用串那样:)呵呵,有.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" 
    /> 

回答

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

谢谢,它完美的作品。 – Darknez 2014-09-24 15:39:32

0

线程不跳过运行。你假设你的整个程序同步运行,而不是。您编写它的方式,UI线程无法正确地与您创建的线程进行通信。

当你的代码打new Thread(...)的一部分,它会产生一个新的线程,同时运行到UI线程。所以a的值可能会或可能不是您所期望的,具体取决于您的背地线是否在setText()之前或之后完成。

有多种与UI线程交流的方式。

使用Handler并从后台线程发送消息给UI线程。

使用AsyncTask并设置在onPostExecute

使用runOnUIThread更新值作为其他答案建议。

或者在你的情况下不产生另一个线程。

Here一些关于多线程在Android的更多信息。

+0

另外,谢谢你的回答。我会仔细看看的。 – Darknez 2014-09-24 15:40:33