0

TextViewsメソッドを使用して別のスレッドから自分を見えるようにするのに問題がありますshowDisclaimer()runOnUiThread()私は自分の可視性を設定するために使用しました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

単純にムーディー、プライベート静的TextView homeText1をグローバルに宣言し、onCreateでそれらを初期化することにより、Chirag Ravalが提案したことを行います。ただし、常にメイン スレッドから UI を更新する必要があります。ただし、showDisclaimer() は引き続きバックグラウンド スレッドで実行されているため、いくつかの異なる方法で showDisclaimer() を実行できます。1 つは、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 に答える