0

这个问题可能已经被问过很多次了..是的!我正面临所谓的“黑屏问题”。
我的第一个活动是哪个主要活动,在哪个活动中完成了登录,这个活动之后是下一个活动,它是用户帐户的简单摘要报告。
现在,对于这份报告,我获取数据集,对其进行解析并使用它来动态构建表格。小人黑屏出现在这里!!报告,如表中的正确呈现,但在该屏幕上,这个黑色半透明层不断出现。
我尝试了一切,使用处理程序、异步任务、半透明主题,但没有任何帮助!当我的摘要报告加载时,恶棍仍然出现。如果我按下“返回”按钮,它就会消失,并且屏幕看起来很正常,就像它第一次加载时所预期的那样。我无法弄清楚到底出了什么问题,无论是我的编码方法(动态生成表)或者它是一个模拟器问题或什么。

My emulator details are as follows:
CPU:ARM
Target: Android 2.3.3
skin: WVGA800
sd card:1024M

有人请救救我!!

编辑:
在我的第二个活动中,我执行以下操作:

   public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_summary_report);
        ad = new AlertDialog.Builder(this).create();
        boolean is = IsConnectedToNetwork(); 
        if (is == true){
                Handler execWS = new Handler();
                execWS.post(callWS);//Fetch Data via web service and parse it
                if(result != null){
                    Handler genUI = new Handler();
                    genUI.post(createUI);// generate the table based on "result". ie. in a for loop i create textviews and append it to the table layout
                }
            }
        else{
            Error = "Connection Failed. Try Again!";
        }
        if(Error.length() != 0){
        ad.setMessage(Error);
        ad.setTitle("Error..");
            ad.show();
        }
    }

我的第二个活动的 Xml 布局..

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:baselineAligned="false"
    android:gravity="center"
    android:orientation="vertical">

    <TableLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="5dip">
            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"
                android:contentDescription="@string/Logo"
                android:src="@drawable/complogo" 
                android:gravity="top"/>
            <TextView
                android:id="@+id/lblLoginInfo"  
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                android:gravity="center_horizontal"/>
    </TableLayout>


    <TableLayout
        android:id="@+id/tblSummRep"
        android:layout_width="wrap_content"
        android:layout_height="0dp"
        android:layout_weight="4"
        android:padding="5dip">
    </TableLayout>
    <TableLayout
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"
        android:padding="5dip">

            <TextView
                android:id="@+id/AppName"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:gravity="center"
                android:text="@string/AppName"
                android:textColor="#ff6600" />

            <TextView
                android:id="@+id/AppVersion"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:gravity="center"
                android:text="@string/AppVersion"
                android:textColor="#ff6600" />

            <TextView
                android:id="@+id/Disclaimer"
                        android:gravity="center"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="@string/Disclaimer"                   
                android:textColor="#ff6600" />
    </TableLayout>
</LinearLayout>

我将文本视图附加到“tblSummRep”..

更新 我的异步任务类..

   private class ShareWork extends AsyncTask<Void, Void, Boolean>{
        ProgressDialog pDlg;
        //String[][] result = null;
        protected void onPreExecute(){
            pDlg.setMessage("Please wait while the Report Loads...");
            pDlg.show();
        }

        @Override
        protected Boolean doInBackground(Void... params) {
            boolean RetVal = false;
            //my fetch code
            return RetVal;
        }


        protected void onPostExecute(Boolean value){
            if(value == true){
                pDlg.setMessage("Please try again later!!");
                pDlg.show();
            }
            else{
                createUI.run();

            }
        }
    }
4

1 回答 1

2

我不知道您所说的“黑屏问题”指的是什么,但您声明您正在获取数据(我猜是从远程服务器获取数据)并且发生了这种情况。这对我来说听起来是关于阻塞 UI 线程的。您在活动的哪个方法中获取数据(可能在 onCreate 中)?您不应该在图形线程上执行耗时的操作,例如查询远程服务器(这可能需要几秒钟)。在这些情况下,始终应使用AsyncTask 。用户应该会收到一些关于后台发生的事情的反馈,因此通常推荐使用 ProgressBar(或至少是微调器)。

您可以在此处查看如何使用 AsyncTask 解决类似问题。

更新

您刚刚发布了您的代码。问题在于(正如我所推测的)这行代码:

execWS.post(callWS);//Fetch Data via web service and parse it

我想这是一个 WS 电话。您在这里阻塞了 UI 线程。以与我提供的链接相同的方式创建一个 AsyncTask,并在任务完成后执行其余代码(显示错误或带有数据的动态表)。

您的 AsyncTask 可能看起来像这样(我还没有尝试过):

private class LoadTableTask extends AsyncTask<URL, Integer, Object> {
     protected Object doInBackground(URL... urls) {
         Handler execWS = new Handler();
         execWS.post(urls[0]);//Fetch Data via web service and parse it
         return result;
     }

     protected void onProgressUpdate(Integer... progress) {
         //Not used in your case. It would be a good idea to create an undefined progress dialog in your case
     }

     protected void onPostExecute(Object result) {
         if(result != null){
                Handler genUI = new Handler();
                genUI.post(createUI);// generate the table based on "result". ie. in a   for loop i create textviews and append it to the table layout
         }

     }
 }

您的 onCreate() 方法将被替换为:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_summary_report);
    ad = new AlertDialog.Builder(this).create();
    boolean is = IsConnectedToNetwork(); 
    if (is == true){
            new LoadTableTask().execute(callWS);
        }
    else{
        Error = "Connection Failed. Try Again!";
    }
    if(Error.length() != 0){
    ad.setMessage(Error);
    ad.setTitle("Error..");
        ad.show();
    }
}
于 2013-01-18T12:07:21.243 回答