0

我在TextViews使用该方法使我在另一个线程中可见时遇到问题showDisclaimer()。我习惯于设置我的 srunOnUiThread()的可见性。TextView基本上,我想在将 csv 导入数据库后显示这些视图。你能看看我错过了什么吗?

public class MainActivity extends Activity {

final static int INDEX_ACCTTYPE = 0; 
final static int INDEX_ECN = 1; 
final static int INDEX_TLN = 2; 
final static int INDEX_SIN = 3; 
final static int INDEX_MOBILE = 4; 
final static int INDEX_CITY = 5;
final static int INDEX_START_DATE = 6;
final static int INDEX_START_TIME = 7;
final static int INDEX_END_DATE = 8; 
final static int INDEX_END_TIME = 9; 
final static int INDEX_REASON = 10;
final static int INDEX_DETAILS = 11;

DatabaseHandler db;
String str;
ProgressDialog pd;

final private String csvFile = "http://www.meralco.com.ph/pdf/pms/pms_test.csv";
final private String uploadDateFile = "http://www.meralco.com.ph/pdf/pms/UploadDate_test.txt";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    TextView homeText1 = (TextView) findViewById(R.id.home_text1);
    TextView homeText2 = (TextView) findViewById(R.id.home_text2);
    TextView homeText3 = (TextView) findViewById(R.id.home_text3);
    TextView homeText4 = (TextView) findViewById(R.id.home_text4);

    homeText1.setVisibility(View.INVISIBLE);
    homeText2.setVisibility(View.INVISIBLE);
    homeText3.setVisibility(View.INVISIBLE);
    homeText4.setVisibility(View.INVISIBLE);

    //db = new DatabaseHandler(MainActivity.this);

    if(dbExists()){
        db = new DatabaseHandler(MainActivity.this);
        Log.d("Count", "" + db.count());

        if(!uploadDateEqualsDateInFile())
            promptOptionalUpdate("There is a new schedule");
        showDisclaimer();
        Log.i("oncreate", "finished!");
        return;
    }

    promptRequiredUpdate("Schedule not updated");
    //showDisclaimer();
    Log.i("oncreate", "finished!");

}

public void promptOptionalUpdate(String Message) {
    AlertDialog.Builder builder = new AlertDialog.Builder(
            this);
    builder.setMessage(Message)
            .setCancelable(false)
            .setPositiveButton("Update Now",
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int id) {
                            Log.d("SHOW ALERT -->!", "update");
                            dropOldSchedule();
                            triggerDownload();
                            dialog.cancel();
                        }
                    })
            .setNegativeButton("Later",
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int id) {
                            Log.d("SHOW ALERT -->!", "cancel");
                            dialog.cancel();
                        }
                    });
    AlertDialog alert = builder.create();
    alert.show();
}

public void dropOldSchedule(){
    //TODO drop old schedule
}

public void triggerDownload() {

    if (!checkInternet()) {
        showAlert("An internet connection is required to perform an update, please check that you are connected to the internet");
        return;
    }

    if(pd!=null && pd.isShowing()) pd.dismiss();
    pd = ProgressDialog.show(this, "Downloading schedule", 
            "This may take a few minutes...", true, false);

    Thread thread = new Thread(new Runnable() {

        public void run() {

            db = new DatabaseHandler(MainActivity.this);
            db.beginTransaction();

            try {
                URL myURL = new URL(csvFile);

                BufferedReader so = new BufferedReader(new InputStreamReader(myURL.openStream()));
                while (true) {
                    String output = so.readLine();
                    if (output != null) {
                        String[] sched = output.split(",");
                        try {
                            db.addRow(sched[INDEX_SIN], sched[INDEX_CITY], 
                                    sched[INDEX_START_DATE], sched[INDEX_START_TIME], 
                                    sched[INDEX_END_DATE], sched[INDEX_END_TIME], 
                                    sched[INDEX_DETAILS], sched[INDEX_REASON]);
                        } catch (IndexOutOfBoundsException e) {
                            db.addRow(sched[INDEX_SIN], sched[INDEX_CITY], 
                                    sched[INDEX_START_DATE], sched[INDEX_START_TIME], 
                                    sched[INDEX_END_DATE], sched[INDEX_END_TIME], 
                                    "", sched[INDEX_REASON]);
                            e.printStackTrace();
                        }
                    }
                    else {
                        break;
                    }
                }

                so.close();
            } catch (MalformedURLException e) {
                e.printStackTrace();
                db.endTransaction();
            } catch (IOException e) {
                e.printStackTrace();
                db.endTransaction();
            } 
            Log.d("Count", ""+db.count());
            db.setTransactionSuccessful();
            db.endTransaction();

            runOnUiThread(new Runnable() {
                public void run() {
                    while (!pd.isShowing());

                    getUploadDate();
                    writeUploadDateInTextFile();
                    showDisclaimer();

                    pd.dismiss();
                }
            });
        }

    });
    thread.start();

    //while(thread.isAlive());

    Log.d("triggerDownload", "thread died, finished dl. showing disclaimer...");

}

public void getUploadDate() {
    Log.d("getUploadDate", "getting upload date of schedule");

    if(pd!=null && pd.isShowing()) pd.dismiss();
    pd = ProgressDialog.show(this, "Getting upload date", 
            "This may take a few minutes...", true, false);

    Thread thread = new Thread(new Runnable() {

        public void run() {

            try {
                URL myURL = new URL(uploadDateFile);

                BufferedReader so = new BufferedReader(new InputStreamReader(myURL.openStream()));
                while (true) {
                    String output = so.readLine();
                    if (output != null) {
                        str = output;
                    }
                    else {
                        break;
                    }
                }
            so.close();
            }
            catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } 

            runOnUiThread(new Runnable() {
                public void run() {
                    while (!pd.isShowing());
                    pd.dismiss();
                }
            });
        }

        });
    thread.start();

    while (thread.isAlive());

    Log.d("getUploadDate","thread died, upload date="+str);
}

public void writeUploadDateInTextFile() {
    Log.d("writeUploadDateTextFile", "writing:"+str);

    try {
        OutputStreamWriter out = new OutputStreamWriter(openFileOutput(
                "update.txt", 0));
        out.write(str);
        out.close();
    } catch (java.io.IOException e) {
        e.printStackTrace();
    }
}

public void showDisclaimer() {
    Log.d("ShowDisclaimer", "showing disclaimer");


    TextView homeText1x = (TextView) findViewById(R.id.home_text1);
    TextView homeText2x = (TextView) findViewById(R.id.home_text2);
    TextView homeText3x = (TextView) findViewById(R.id.home_text3);
    TextView homeText4x = (TextView) findViewById(R.id.home_text4);

    homeText3x
    .setText("You may view the schedule of pre-arranged power interruptions by clicking any of these buttons : SIN, City or Date. " +
            "The schedule has been updated as of " + str
            + ". Meralco is exerting all efforts to restore electric service as scheduled." +
            " The schedule, however, may change without further notice. For verification, follow-ups, or " +
            "latest updates, please contact our CALL CENTER through telephone nos. 16211, " +
            "fax nos. 1622-8554/1622-8556 or email address callcenter.tech.assist@meralco.com.ph.");


    homeText1x.setVisibility(View.VISIBLE);
    homeText2x.setVisibility(View.VISIBLE);
    homeText3x.setVisibility(View.VISIBLE);
    homeText4x.setVisibility(View.VISIBLE);

    Log.d("ShowDisclaimer", "finished showing disclaimer");

}

public void promptRequiredUpdate(String Message) {
    Log.d("required update","required!");
    AlertDialog.Builder builder = new AlertDialog.Builder(
            this);
    builder.setMessage(Message)
    .setCancelable(false)
    .setPositiveButton("Update Now",
            new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int id) {
            Log.d("SHOW ALERT -->!", "update");
            triggerDownload();
            dialog.cancel();
        }
    })
    .setNegativeButton("Later",
        new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
                Log.d("SHOW ALERT -->!", "cancel");
                dialog.cancel();
                finish();
            }
    });
    AlertDialog alert = builder.create();
    alert.show();
}

public boolean uploadDateEqualsDateInFile() {
    Log.d("uploadDateEqualsDateInFile","comparing schedule upload dates");

    getUploadDate();

    try {
        String recordedDate = "";
        InputStream instream = openFileInput("update.txt");
        if (instream != null) { // if file the available for reading
            Log.d("uploadDateEqualsDateInFile","update.txt found!");

            InputStreamReader inputreader = new InputStreamReader(instream);
            BufferedReader buffreader = new BufferedReader(inputreader);

            String line = null;
            while ((line = buffreader.readLine()) != null) {
                recordedDate = line;
                Log.d("uploadDateEqualsDateInFile","recorded:"+recordedDate);
            }

            Log.d("uploadDateEqualsDateInFile","last upload date: " + str + ", recorded:" +recordedDate);

            if(str.equals(recordedDate)) return true;
            return false;
        }
        Log.d("uploadDateEqualsDateInFile","update.txt is null!");
        return false;

    } catch (FileNotFoundException e) {
        e.printStackTrace();
        return false;

    } catch (IOException e) {
        e.printStackTrace();
        return false;
    }

}

public void showAlert(String Message) {
    AlertDialog.Builder builder = new AlertDialog.Builder(getBaseContext());
    builder.setMessage(Message).setCancelable(false)
            .setNeutralButton("Ok", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    dialog.cancel();
                }
            });
    AlertDialog alert = builder.create();
    alert.show();
}

public boolean checkInternet() {
    ConnectivityManager cm = (ConnectivityManager) this
            .getSystemService(Context.CONNECTIVITY_SERVICE);

    NetworkInfo infos[] = cm.getAllNetworkInfo();

    for (NetworkInfo info : infos)
        if (info.getState() == NetworkInfo.State.CONNECTED
                || info.getState() == NetworkInfo.State.CONNECTING) {
            return true;
        }

    return false;
}

public boolean dbExists() {

    File database=getApplicationContext().getDatabasePath(DatabaseHandler.DATABASE_NAME);

    if (!database.exists()) {
        Log.i("Database", "Not Found");
        return false;
    }

    Log.i("Database", "Found");
    return true;

}

@Override
protected void onDestroy() {
    super.onDestroy();
    if (db != null) {
        db.close();
    }
}
@Override
protected void onPause() {
    super.onPause();
    if (db != null) {
        db.close();
    }
}

}

4

1 回答 1

0

简直喜怒无常,按照 Chirag Raval 的建议,在全局范围内声明私有静态 TextView homeText1,并在您的 onCreate 中初始化它们。但是,您应该始终从主线程更新 UI。但是 showDisclaimer() 仍在后台线程上运行,因此您可以通过几种不同的方式运行 showDisclaimer()。一种是执行您在 getUploadDate() 中所做的事情:

 runOnUiThread(new Runnable() {
            public void run() {
               showDisclaimer()
            }
        });

或者您可以使用处理程序:

private Handler showDisclaimerHandler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
homeText3x.setText("TEXT");


homeText1x.setVisibility(View.VISIBLE);
homeText2x.setVisibility(View.VISIBLE);
homeText3x.setVisibility(View.VISIBLE);
homeText4x.setVisibility(View.VISIBLE);

Log.d("ShowDisclaimer", "finished showing disclaimer");



return false;
}
});

在后台线程的任何地方,您都希望运行 showDisclaimer(),而是运行:

showDisclaimerHandler.sendEmptyMessage(0);
于 2012-07-30T07:20:08.757 回答