我目前正在開發一個應用程序,用戶可以將日誌發佈到項目中。但是,似乎我遇到了問題,似乎無法找到答案。用戶發佈帖子後,後退按鈕不會關閉日誌活動。相反,它會使應用程序無響應;來自這種實例的logcat位於底部。然而,點擊「等待」而不是「強制關閉」會恢復應用程序,但後退按鈕仍然不起作用。以下是活動的佈局。 viewflipper中的每個視圖都是具有多個edittext的項目的不同日誌,以填充信息和一個按鈕以發佈到日誌。最初,這是在列表視圖中顯示當前帖子在帖子按鈕下方顯示的位置。此時,後退按鈕具有全部功能。但是,scrollview中的listview效果不佳,因此必須將其更改爲帶有listview的滑動drawer,每次用戶在日誌之間翻轉時,其適配器都會更改。這是後退按鈕功能丟失的地方。起初我以爲我在我的onKeyDown方法中做了一些錯誤,但在嘗試調試它之後,修改它,甚至刪除它,我發現它永遠不會被調用。因爲這是在我換成滑動抽屜後開始發生的,我的結論是它與滑動抽屜有關。任何幫助,將不勝感激。爲什麼android按鈕會凍結我的應用程序而無法運行?
編輯:經過徹底的探索這個問題,我發現它不只是後退按鈕,這樣做。設置按鈕和搜索按鈕也都表現出這種行爲。顯示正確功能的唯一按鈕是主頁按鈕。但是,活動內的功能不受影響。我仍然可以發佈,在視圖之間翻轉,並查看和編輯帖子。
<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/iphonebg" >
<TableRow
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="0"
android:background="@drawable/toolbar_gradient"
android:gravity="center_vertical" >
<!-- Header -->
</TableRow>
<TableRow
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="0" >
<!-- Date -->
</TableRow>
<TableRow
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="0" >
<!-- Tabs -->
</TableRow>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_gravity="center" >
<TableLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/iphonebg" >
<TableRow
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1" >
<ViewFlipper
android:id="@+id/ViewFlipper01"
android:layout_width="0dip"
android:layout_height="fill_parent"
android:layout_weight="2" >
<!-- adding views to ViewFlipper -->
<!-- ScrollView 1 -->
<!-- ScrollView 2 -->
<!-- ScrollView 3 -->
<!-- ScrollView 4 -->
<!-- ScrollView 5 -->
</ViewFlipper>
</TableRow>
</TableLayout>
<SlidingDrawer
android:id="@+id/drawer"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:content="@+id/anyPosts"
android:handle="@+id/handle" >
<Button
android:id="@+id/handle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:minHeight="35dip"
android:background="@drawable/black_btn_bg"
android:text="Drag or Tap to View Posts"
android:textColor="#FFFFFF"
android:textStyle="bold" />
<ListView
android:id="@+id/anyPosts"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:paddingLeft="5dip"
android:paddingRight="5dip" >
</ListView>
</SlidingDrawer>
</FrameLayout>
</TableLayout>
代碼處理該滑動抽屜,位於我的onCreate方法的程度:
final SlidingDrawer slide = (SlidingDrawer) findViewById(R.id.drawer);
final Button btnDownloads = (Button) findViewById(R.id.handle);
slide.setOnDrawerOpenListener(new OnDrawerOpenListener() {
@Override
public void onDrawerOpened() {
btnDownloads.setText("Drag or Tap to Close Posts");
}
});
slide.setOnDrawerCloseListener(new OnDrawerCloseListener() {
@Override
public void onDrawerClosed() {
btnDownloads.setText("Drag or Tap to View Posts");
}
});
slide.animateOpen();
處理列表視圖的代碼的程度:
ListView listToFill = (ListView) findViewById(R.id.anyPosts);
listToFill.setAdapter(listViewAdapter);
logcat的:
06-07 13:51:44.394: I/InputDispatcher(1464): Application is not responding: AppWindowToken{40cd7758 token=HistoryRecord{40534788 uda.projectlogging/.Radio_Group}} - Window{40ae0a88 uda.projectlogging/uda.projectlogging.Radio_Group paused=false}. 10009.8ms since event, 10009.4ms since wait started
06-07 13:51:44.394: I/WindowManager(1464): Input event dispatching timed out sending to uda.projectlogging/uda.projectlogging.Radio_Group
06-07 13:51:44.444: I/Process(1464): Sending signal. PID: 23939 SIG: 3
06-07 13:51:44.444: I/dalvikvm(23939): threadid=4: reacting to signal 3
06-07 13:51:44.444: I/dalvikvm(23939): Wrote stack traces to '/data/anr/traces.txt'
06-07 13:51:44.444: I/Process(1464): Sending signal. PID: 1464 SIG: 3
06-07 13:51:44.444: I/dalvikvm(1464): threadid=4: reacting to signal 3
06-07 13:51:44.484: I/dalvikvm(1464): Wrote stack traces to '/data/anr/traces.txt'
06-07 13:51:44.484: I/Process(1464): Sending signal. PID: 1690 SIG: 3
06-07 13:51:44.484: I/dalvikvm(1690): threadid=4: reacting to signal 3
06-07 13:51:44.484: I/dalvikvm(1690): Wrote stack traces to '/data/anr/traces.txt'
06-07 13:51:44.484: I/Process(1464): Sending signal. PID: 1639 SIG: 3
06-07 13:51:44.484: I/dalvikvm(1639): threadid=4: reacting to signal 3
06-07 13:51:44.494: I/dalvikvm(1639): Wrote stack traces to '/data/anr/traces.txt'
06-07 13:51:44.494: I/Process(1464): Sending signal. PID: 1689 SIG: 3
06-07 13:51:44.494: I/dalvikvm(1689): threadid=4: reacting to signal 3
06-07 13:51:44.494: I/dalvikvm(1689): Wrote stack traces to '/data/anr/traces.txt'
06-07 13:51:44.494: I/Process(1464): Sending signal. PID: 1672 SIG: 3
06-07 13:51:44.494: I/dalvikvm(1672): threadid=4: reacting to signal 3
06-07 13:51:44.494: I/dalvikvm(1672): Wrote stack traces to '/data/anr/traces.txt'
06-07 13:51:44.494: I/Process(1464): Sending signal. PID: 1656 SIG: 3
06-07 13:51:44.494: I/dalvikvm(1656): threadid=4: reacting to signal 3
06-07 13:51:44.504: I/dalvikvm(1656): Wrote stack traces to '/data/anr/traces.txt'
06-07 13:51:44.504: I/Process(1464): Sending signal. PID: 1652 SIG: 3
06-07 13:51:44.504: I/dalvikvm(1652): threadid=4: reacting to signal 3
06-07 13:51:44.514: I/dalvikvm(1652): Wrote stack traces to '/data/anr/traces.txt'
06-07 13:51:44.514: I/Process(1464): Sending signal. PID: 1642 SIG: 3
06-07 13:51:44.514: I/dalvikvm(1642): threadid=4: reacting to signal 3
06-07 13:51:44.514: I/dalvikvm(1642): Wrote stack traces to '/data/anr/traces.txt'
06-07 13:51:44.514: I/Process(1464): Sending signal. PID: 1664 SIG: 3
06-07 13:51:44.514: I/dalvikvm(1664): threadid=4: reacting to signal 3
06-07 13:51:44.514: I/dalvikvm(1664): Wrote stack traces to '/data/anr/traces.txt'
06-07 13:51:44.514: I/Process(1464): Sending signal. PID: 1675 SIG: 3
06-07 13:51:44.514: I/dalvikvm(1675): threadid=4: reacting to signal 3
06-07 13:51:44.514: I/dalvikvm(1675): Wrote stack traces to '/data/anr/traces.txt'
06-07 13:51:44.514: I/Process(1464): Sending signal. PID: 1691 SIG: 3
06-07 13:51:44.514: I/dalvikvm(1691): threadid=4: reacting to signal 3
06-07 13:51:44.514: I/dalvikvm(1691): Wrote stack traces to '/data/anr/traces.txt'
06-07 13:51:44.514: I/Process(1464): Sending signal. PID: 1590 SIG: 3
06-07 13:51:44.514: I/dalvikvm(1590): threadid=4: reacting to signal 3
06-07 13:51:44.524: I/dalvikvm(1590): Wrote stack traces to '/data/anr/traces.txt'
06-07 13:51:44.734: D/dalvikvm(1464): GC_CONCURRENT freed 1754K, 33% free 9128K/13511K, external 6035K/6964K, paused 2ms+6ms
06-07 13:51:44.814: D/dalvikvm(1464): GC_EXPLICIT freed 31K, 33% free 9107K/13511K, external 6035K/6964K, paused 71ms
06-07 13:51:44.914: E/NetlinkEvent(1351): NetlinkEvent::FindParam(): Parameter 'UDEV_LOG' not found
06-07 13:51:45.364: E/ActivityManager(1464): ANR in uda.projectlogging, pid 23939 (uda.projectlogging/.Radio_Group)
06-07 13:51:45.364: E/ActivityManager(1464): Reason: keyDispatchingTimedOut
06-07 13:51:45.364: E/ActivityManager(1464): Load: 0.26/0.25/0.21
06-07 13:51:45.364: E/ActivityManager(1464): CPU usage from 7340ms to 0ms ago with 99% awake:
06-07 13:51:45.364: E/ActivityManager(1464): 0.9% 783/als_wq: 0% user + 0.9% kernel
06-07 13:51:45.364: E/ActivityManager(1464): 0.8% 1464/system_server: 0.1% user + 0.6% kernel/faults: 1 minor
06-07 13:51:45.364: E/ActivityManager(1464): 0.5% 1489/ActivityManager: 0.1% user + 0.4% kernel
06-07 13:51:45.364: E/ActivityManager(1464): 0.2% 1543/InputDispatcher: 0% user + 0.2% kernel
06-07 13:51:45.364: E/ActivityManager(1464): 0.1% 1539/PowerManagerSer: 0% user + 0.1% kernel
06-07 13:51:45.364: E/ActivityManager(1464): 0% 19639/com.svox.pico: 0% user + 0% kernel/faults: 56 minor
06-07 13:51:45.364: E/ActivityManager(1464): 0% 19639/com.svox.pico: 0% user + 0% kernel
06-07 13:51:45.364: E/ActivityManager(1464): 0.4% 288/tegra_spi.1: 0% user + 0.4% kernel
06-07 13:51:45.364: E/ActivityManager(1464): 0.4% 19564/com.android.vending: 0.2% user + 0.1% kernel
06-07 13:51:45.364: E/ActivityManager(1464): 0.2% 19566/HeapWorker: 0.1% user + 0.1% kernel
06-07 13:51:45.364: E/ActivityManager(1464): 0% 1358/battd: 0% user + 0% kernel
06-07 13:51:45.364: E/ActivityManager(1464): 0.1% 21254/com.motorola.android.datamanager: 0.1% user + 0% kernel
06-07 13:51:45.364: E/ActivityManager(1464): 0.1% 21255/HeapWorker: 0.1% user + 0% kernel
06-07 13:51:45.364: E/ActivityManager(1464): 7.9% TOTAL: 1.3% user + 2% kernel + 0.1% iowait + 4.3% softirq
06-07 13:51:45.364: E/ActivityManager(1464): CPU usage from 420ms to 934ms later with 99% awake:
06-07 13:51:45.364: E/ActivityManager(1464): 7.6% 1464/system_server: 1.9% user + 5.7% kernel/faults: 1 minor
06-07 13:51:45.364: E/ActivityManager(1464): 3.8% 1543/InputDispatcher: 0% user + 3.8% kernel
06-07 13:51:45.364: E/ActivityManager(1464): 3.9% TOTAL: 1.9% user + 1.9% kernel
當後按鈕被點擊:
postButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
v.startAnimation(AnimationUtils.loadAnimation(
getApplicationContext(), R.anim.image_click));
data = new JSONObject();
if (description.equals("")) {
runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(getApplicationContext(),
"Please Enter a Description",
Toast.LENGTH_LONG).show();
}
});
} else if (delayStart == null) {
runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(getApplicationContext(),
"Please Set Delay Duration",
Toast.LENGTH_LONG).show();
}
});
} else {
try {
data.put("COMMENT", description);
data.put("DELAYSTART",
delayStart.get(Calendar.HOUR_OF_DAY) + ":"
+ delayStart.get(Calendar.MINUTE));
data.put("DELAYEND", delayEnd.get(Calendar.HOUR_OF_DAY)
+ ":" + delayEnd.get(Calendar.MINUTE));
postEntry();
description = "";
delayHours = 0;
delayMinutes = 0;
delayStart = null;
delayEnd = null;
delay.setText("");
} catch (JSONException e) {
e.printStackTrace();
}
}
}
});
發表記錄:
public void postEntry() {
final ProgressDialog dialog1 = new ProgressDialog(this);
dialog1.setCancelable(true);
dialog1.setMessage("Loading...");
dialog1.show();
final Thread background1 = new Thread(new Runnable() {
public void run() {
Looper.prepare();
try {
String type1 = "0";
switch (current) {
case 0:
type1 = "1";
break;
case 1:
type1 = "4";
break;
case 2:
type1 = "3";
break;
case 3:
type1 = "6";
break;
case 4:
type1 = "5";
break;
}
if (helperMethods.isOnline(currentActivity)) {
if (failedUploads)
doFailedUploads();
SoapObject request = new SoapObject(
"http://www.constructiononline.com/service/",
"OSLPost");
PropertyInfo num1 = new PropertyInfo();
num1.setName("userEmail");
num1.setValue(settings.getString("EMAIL", ""));
request.addProperty(num1);
num1 = new PropertyInfo();
num1.setName("prj_id");
num1.setValue(projectInfo.getID());
request.addProperty(num1);
num1 = new PropertyInfo();
num1.setName("entryDate");
num1.setValue(month + "/" + day + "/" + year);
request.addProperty(num1);
num1 = new PropertyInfo();
num1.setName("type");
num1.setValue(type1);
request.addProperty(num1);
num1 = new PropertyInfo();
num1.setName("data");
num1.setValue(data.toString());
request.addProperty(num1);
num1 = new PropertyInfo();
num1.setName("delete");
num1.setValue("false");
request.addProperty(num1);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
SoapEnvelope.VER11);
envelope.dotNet = true;
envelope.setOutputSoapObject(request);
HttpTransportSE androidHttpTransport = new HttpTransportSE(
URL);
androidHttpTransport
.call("http://www.constructiononline.com/service/OSLPost",
envelope);
Log.e("Response from Post", envelope.getResponse()
.toString());
updatePostList(false);
} else {
addFailedUploads(settings.getString("EMAIL", ""),
projectInfo.getID(), month + "/" + day + "/"
+ year, type1, data.toString());
JSONObject j = new JSONObject();
j.put("LOG_OBJECT", data);
j.put("TYPE", type1);
j.put("DATE", month + "/" + day + "/" + year);
Calendar c = Calendar.getInstance();
String created = c.get(Calendar.MONTH) + "/"
+ c.get(Calendar.DAY_OF_MONTH) + "/"
+ c.get(Calendar.YEAR) + " "
+ c.get(Calendar.HOUR) + ":"
+ c.get(Calendar.MINUTE) + ":"
+ c.get(Calendar.SECOND) + " "
+ (c.get(Calendar.AM_PM) == 0 ? "AM" : "PM");
j.put("CREATED", created);
JSONObject creatorTemp = new JSONObject();
creatorTemp.put("ID", "0");
creatorTemp.put("NAME", " ");
creatorTemp.put("COMPANY", " ");
creatorTemp.put("ICON", "NULL");
j.put("CREATOR", creatorTemp);
j.put("ID", "0");
switch (current) {
case 0:
weatherEntries.put(j);
break;
case 1:
workEntries.put(j);
break;
case 2:
visitorEntries.put(j);
break;
case 3:
deliveryEntries.put(j);
break;
case 4:
noteEntries.put(j);
break;
}
}
if (dialog1 != null && dialog1.isShowing()) {
dialog1.dismiss();
}
} catch (final Exception e) {
e.printStackTrace();
StringWriter sw = new StringWriter();
e.printStackTrace(new PrintWriter(sw));
String stacktrace = sw.toString();
addOnlineErrorLogEntry(e.getMessage(), stacktrace);
if (dialog1 != null && dialog1.isShowing()) {
dialog1.dismiss();
}
runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(getApplicationContext(),
e.getMessage() + " in setupProjects",
Toast.LENGTH_LONG).show();
}
});
}
}
});
// start the background thread
background1.start();
}
更新帖子列表:
private void updatePostList(final boolean getAll) {
if (!helperMethods.isOnline(currentActivity)) {
return;
}
final ProgressDialog dialog1 = new ProgressDialog(this);
dialog1.setCancelable(true);
dialog1.setMessage("Loading...");
dialog1.show();
final Thread background1 = new Thread(new Runnable() {
public void run() {
Looper.prepare();
try {
if (failedUploads)
doFailedUploads();
SoapObject request = new SoapObject(
"http://www.constructiononline.com/service/",
"OSLGet");
PropertyInfo num1 = new PropertyInfo();
num1.setName("userEmail");
num1.setValue(settings.getString("EMAIL", ""));
request.addProperty(num1);
num1 = new PropertyInfo();
num1.setName("prj_id");
num1.setValue(projectInfo.getID());
request.addProperty(num1);
num1 = new PropertyInfo();
num1.setName("startDate");
num1.setValue("");
if (!getAll) {
num1.setValue(month + "/" + day + "/" + year);
}
request.addProperty(num1);
num1 = new PropertyInfo();
num1.setName("endDate");
num1.setValue("");
request.addProperty(num1);
num1 = new PropertyInfo();
num1.setName("type");
num1.setValue("");
if (!getAll) {
switch (current) {
case 0:
num1.setValue("1");
break;
case 1:
num1.setValue("4");
break;
case 2:
num1.setValue("3");
break;
case 3:
num1.setValue("6");
break;
case 4:
num1.setValue("5");
break;
}
}
request.addProperty(num1);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
SoapEnvelope.VER11);
envelope.dotNet = true;
envelope.setOutputSoapObject(request);
HttpTransportSE androidHttpTransport = new HttpTransportSE(
URL);
androidHttpTransport.call(
"http://www.constructiononline.com/service/OSLGet",
envelope);
Log.e("response", envelope.getResponse().toString());
JSONObject temp = new JSONObject(envelope.getResponse()
.toString());
JSONArray entries = temp.getJSONArray("ENTRIES");
if (getAll) {
weatherEntries = new JSONArray();
workEntries = new JSONArray();
visitorEntries = new JSONArray();
deliveryEntries = new JSONArray();
noteEntries = new JSONArray();
}
switch (current) {
case 0:
weatherEntries = new JSONArray();
break;
case 1:
workEntries = new JSONArray();
break;
case 2:
visitorEntries = new JSONArray();
break;
case 3:
deliveryEntries = new JSONArray();
break;
case 4:
noteEntries = new JSONArray();
break;
}
for (int x = 0; x < entries.length(); x++) {
switch (entries.getJSONObject(x).getInt("TYPE")) {
case 1:
weatherEntries.put(entries.getJSONObject(x));
break;
case 3:
visitorEntries.put(entries.getJSONObject(x));
break;
case 4:
workEntries.put(entries.getJSONObject(x));
break;
case 5:
noteEntries.put(entries.getJSONObject(x));
break;
case 6:
deliveryEntries.put(entries.getJSONObject(x));
break;
}
}
runOnUiThread(new Runnable() {
@Override
public void run() {
if (getAll) {
setupWeatherLog();
} else {
getPosts();
}
}
});
if (dialog1 != null && dialog1.isShowing()) {
dialog1.dismiss();
}
} catch (final Exception e) {
e.printStackTrace();
StringWriter sw = new StringWriter();
e.printStackTrace(new PrintWriter(sw));
String stacktrace = sw.toString();
addOnlineErrorLogEntry(e.getMessage(), stacktrace);
if (dialog1 != null && dialog1.isShowing()) {
dialog1.dismiss();
}
runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(getApplicationContext(),
e.getMessage() + " in setupProjects",
Toast.LENGTH_LONG).show();
}
});
}
if (dialog1 != null && dialog1.isShowing()) {
dialog1.dismiss();
}
}
});
// start the background thread
background1.start();
}
填充列表視圖:
private void getPosts() {
JSONArray entriesToShow = new JSONArray();
JSONArray postsToLoad = null;
switch (current) {
case 0:
postsToLoad = weatherEntries;
break;
case 1:
postsToLoad = workEntries;
break;
case 2:
postsToLoad = visitorEntries;
break;
case 3:
postsToLoad = deliveryEntries;
break;
case 4:
postsToLoad = noteEntries;
break;
}
for (int i = 0; i < postsToLoad.length(); i++) {
try {
JSONObject temp = postsToLoad.getJSONObject(i);
String[] tempDay = temp.getString("DATE").split("/");
if (Integer.parseInt(tempDay[0]) == month
&& Integer.parseInt(tempDay[1]) == day
&& Integer.parseInt(tempDay[2]) == year) {
entriesToShow.put(temp);
}
} catch (JSONException e) {
e.printStackTrace();
}
}
BaseAdapter listViewAdapter;
switch (current) {
case 0:
listViewAdapter = new WeatherDeliveryVisitLazyAdapter(
currentActivity, entriesToShow, current);
break;
case 1:
listViewAdapter = new WorkLogPostLazyAdapter(currentActivity,
entriesToShow);
break;
case 2:
listViewAdapter = new WeatherDeliveryVisitLazyAdapter(
currentActivity, entriesToShow, current);
break;
case 3:
listViewAdapter = new WeatherDeliveryVisitLazyAdapter(
currentActivity, entriesToShow, current);
break;
case 4:
listViewAdapter = new ProjectNotePostLazyAdapter(currentActivity,
entriesToShow);
break;
default:
listViewAdapter = new ProjectNotePostLazyAdapter(currentActivity,
entriesToShow);
}
if (listViewAdapter == null || listViewAdapter.getCount() == 0) {
runOnUiThread(new Runnable() {
public void run() {
Toast.makeText(getApplicationContext(),
"No Posts to Display", Toast.LENGTH_SHORT).show();
}
});
}
ListView listToFill = (ListView) findViewById(R.id.anyPosts);
listToFill.setAdapter(listViewAdapter);
}
那是它所做的一切在任何日誌中點擊發布按鈕。如果我已經正確解釋了這一點,當所有的進度對話框都清除了屏幕後,後臺線程就結束了,唯一在UI線程上運行的,除了吐司之外的錯誤或不完整的信息,正在設置listview,它會完成。當我拉開抽屜時,它會顯示正確的帖子列表。
編輯我發現如果我在updatePostList方法中註釋掉進度對話框,它就可以正常工作。這是一個新問題:爲什麼世界上就是解決方案?
最終編輯我想通了。該進程對話框正從後臺線程啓動。修改postEntry方法,以便在UI線程上調用updatePostList,以便在UI線程上創建進度對話框,並且它可以工作。好極了。
我一直在尋找到這一點,但問題是,我有一個冗長的任務,得到了來自服務器的項目日誌條目,在後臺線程中處理,並在我點擊後退按鈕之前完成。在單擊後退按鈕之前,我沒有任何在UI線程上運行的任務(我知道)。 – skUDA
你能發表更多的代碼嗎? – twaddington
我已經發布了一些在單擊發布按鈕時執行的內容。 – skUDA