我正在使用 FTP 上传文件。这很好用。该文件包含应用程序应该做什么的信息。所以我正在执行以下操作:1)使用 Apache FTP 客户端下载文件(似乎工作正常) 2)尝试使用 BufferedReader 和 FileReader 读取文件。
问题:读取文件时出现 NullPointerException。我想这是一个时间问题。
代码有这样的结构:
...
getFile().execute();
BufferedReader br = new BufferedReader(...);
我怎么解决这个问题?我必须使用单独的线程(AsyncTask)来下载文件,否则它会抛出 NetworkOnMainThread 异常。但是我怎样才能等到文件完全下载而不冻结 UI 呢?我无法在 AsyncTask 中使用 BufferedReader,因为我使用 GUI 元素并且必须在 GUI 线程上运行交互,但我无法从 AsyncTask 访问它。RunOnUiThread 不能正常工作,因为我在 BroadcastReceiver 中。
一些代码:
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;
}
}
广播接收器类:
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
}
....
这是相关的代码。