我目前正在为Android制作应用程序,我遇到一个问题,即我从主要活动开始的新活动的用户界面没有出现。我不知道问题是什么。
这是我的第二个活动布局xml文件:
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/TableLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.tabcards.android.Search" >
<TableRow
android:id="@+id/tableRow1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1" >
<ScrollView
android:id="@+id/scrollView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="5dp"
>
<TableLayout
android:id="@+id/tableScrollView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:stretchColumns="yes"
android:padding="5dp"
android:background="@color/gray">
</TableLayout>
</ScrollView>
</TableRow>
这是我的活动代码:
public class Search extends ActionBarActivity {
TableLayout tableScrollView;
String[] JSONExceptions = { "type", "em", "user_id", "id", "profilepic", "bg"};
String value;
JSONObject jObject;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_search);
Bundle extras = getIntent().getExtras();
if (extras != null) {
value = extras.getString("id");
}
System.out.println(value);
tableScrollView = (TableLayout) findViewById(R.id.tableScrollView);
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
jObject = getJson("http://www.tabcards.com/req/androidapi/L2o30H8JlFMtFYHW3KLxkts20ztc5Be6Z6m6v315/json/"
+ value);
} catch (Exception e) {
e.printStackTrace();
}
}
});
thread.start();
try {
thread.join();
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
new Thread(new Runnable() {
@Override
public void run() {
try {
createUI(jObject);
} catch (JSONException e) {
e.printStackTrace();
}
}
});
System.out.println("complete");
}
private void createUI(JSONObject jObject) throws JSONException {
Iterator<?> keys = jObject.keys();
int absIndex = 0;
while( keys.hasNext() ){
String key = (String)keys.next();
if(!contains2(JSONExceptions , jObject.get(key))){
String value = jObject.getString(key);
System.out.println("level 1");
if(value!="") {
insertElement(key + " : " + value, absIndex++);
}
}
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.search, menu);
return true;
}
private void insertElement(String data, int i) {
LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View newRow = inflater.inflate(R.layout.row, null, false);
newRow.setLayoutParams(new TableRow.LayoutParams(TableRow.LayoutParams.MATCH_PARENT, TableRow.LayoutParams.WRAP_CONTENT));
TextView dataTextView = (TextView) newRow
.findViewById(R.id.rowTextView);
dataTextView.setText(data);
System.out.println(dataTextView.getText().toString());
tableScrollView.addView(newRow, i);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
private InputStream downloadUrl(String urlString) throws IOException {
URL url = new URL(urlString);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(10000 /* milliseconds */);
conn.setConnectTimeout(15000 /* milliseconds */);
conn.setRequestMethod("GET");
conn.setDoInput(true);
// Starts the query
conn.connect();
return conn.getInputStream();
}
static InputStream is = null;
static JSONObject jObj = null;
static String json = "";
public static JSONObject getJson(String url){
InputStream is = null;
String result = "";
JSONObject jsonObject = null;
// HTTP
try {
HttpClient httpclient = new DefaultHttpClient(); // for port 80 requests!
HttpPost httppost = new HttpPost(url);
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
is = entity.getContent();
} catch(Exception e) {
return null;
}
// Read response to string
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(is,"utf-8"),8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
System.out.println(line);
}
is.close();
result = sb.toString().replace("[", "");
} catch(Exception e) {
return null;
}
// Convert string to object
try {
jsonObject = new JSONObject(result.replace("]", ""));
} catch(JSONException e) {
return null;
}
return jsonObject;
}
这就是我创建活动的方式:
Intent i = new Intent(getApplicationContext(), Search.class);
i.putExtra("id",searchEditText.getText().toString());
startActivity(i);
如果您需要更多信息,请告诉我。
答案 0 :(得分:1)
<强>问题:强>
thread.join();
问题是dreadlock
您正在等待thread
执行,这将使您的UI线程处于阻止状态,如Thread.Sleep()
,因此UI线程正在等待您的请求完成执行,然后才能在屏幕上显示布局。
Like sleep, join responds to an interrupt by exiting with an InterruptedException.
<强>溶液强>
只使用一个仍会等待请求的帖子(createUI
)并在之后执行createUI
方法。
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
try {
jObject = getJson("http://www.tabcards.com/req/androidapi/L2o30H8JlFMtFYHW3KLxkts20ztc5Be6Z6m6v315/json/"
+ value);
createUI(jObject);
} catch (Exception e) {
e.printStackTrace();
}
}
});
thread.start();