FTP を使用してファイルをアップロードしています。これはうまくいきます。このファイルには、アプリが何をすべきかという情報が含まれています。だから私は次のことをしています: 1) Apache FTP クライアントでファイルをダウンロードします (うまくいくようです) 2) BufferedReader と FileReader でファイルを読み出そうとします.
問題: ファイルの読み取り中に NullPointerException が発生します。これはタイミングの問題だと思います。
コードの構造は次のとおりです。
...
getFile().execute();
BufferedReader br = new BufferedReader(...);
どうすればこの問題を解決できますか? 別のスレッド (AsyncTask) を使用してファイルをダウンロードする必要があります。そうしないと、NetworkOnMainThread 例外がスローされます。しかし、UI をフリーズせずにファイルが完全にダウンロードされるまで待つにはどうすればよいでしょうか? GUI要素を使用し、GUIスレッドで対話を実行する必要があるため、AsyncTask内でBufferedReaderを使用できませんが、AsyncTaskからアクセスできません。私はBroadcastReceiverの中にいるので、RunOnUiThreadはうまくいきません。
いくつかのコード:
private class GetTask extends AsyncTask{
public GetTask(){
}
@Override
protected Object doInBackground(Object... arg0) {
FTPClient client = new FTPClient();
try {
client.connect("*****");
}
catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
client.login("*****", "*****");
}
catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
FileOutputStream fos = null;
try {
fos = new FileOutputStream( "/sdcard/"+userID+".task" );
}
catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
resultOk &= client.retrieveFile( userID+".task", fos );
}
catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
Thread.sleep(5000);
}
catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}/**
try {
client.deleteFile(userID+".task");
}
catch (IOException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}
**/
try {
client.disconnect();
}
catch (IOException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}
return null;
}
}
Broadcastreceiver クラス:
public class LiveAction extends BroadcastReceiver {
...
private Context cont;
FileReader fr = null;
BufferedReader br;
@Override
public void onReceive(Context context, Intent intent)
{
cont = context;
...
new GetTask().execute();
try {
Thread.sleep(3000);
}
catch (InterruptedException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}
try {
fr = new FileReader("/sdcard/"+userID+".task");
}
catch (FileNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
br = new BufferedReader(fr)
String strline = "";
try {
while ((strline = br.readLine()) != null){
if(strline.equals("taskone")){
//Some GUI Tasks
}
....
これは関連するコードです。