-1

我正在使用 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
                            }
            ....

这是相关的代码。

4

2 回答 2

1

我认为最好的方法是从 AsyncTask 内的 doInBackground 读取文件的内容,然后输出一个对象,其中包含您在异步任务的 onPostExecute 方法上所需的信息,然后操作您的 UI。

private AsyncTask<String,Void,FileInfo> getFile(){
      return new AsyncTask<String,Void,FileInfo>{
            protected FileInfo doInBackground(String url){
                 FileInfo finfo = new FileInfo(); // FileInfo is a custom object that you need to define that has all the stuff that you need from the file you just downloaded
                 // Fill the custom file info object with the stuff you need from the file
                 return finfo;
            }

            protected void onPostExecute(FileInfo finfo) {
                // Manipulate UI with contents of file info
            }

      };
}


getFile().execute();

另一种选择是从 onPostExecute 调用另一个 AsyncTask 来进行文件解析,但我不推荐它

于 2013-10-08T20:49:52.227 回答
0

我会尝试这样的事情:

private class GetTask extends AsyncTask{
    LiveAction liveAction;
    public GetTask(LiveAction liveAction){
        this.liveAction = liveAction;
    }
    ...  
    @Override
    protected void onPostExecute(String result) {
        liveAction.heyImDoneWithdownloading();             
    }
}

Ps:为什么是 Thread.sleep(5000)?

public class LiveAction extends BroadcastReceiver {
    ...
    public void heyImDoneWithdownloading(){
        //all the things you want to do on the ui thread
    }
}
于 2013-10-08T21:11:19.903 回答