-1

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
                            }
            ....

これは関連するコードです。

4

2 に答える 2