【问题标题】:Error while executing Async Task执行异步任务时出错
【发布时间】:2013-05-27 09:11:30
【问题描述】:

我正在尝试从几个网页中获取一些数据并将其保存到文件中。我在 Android (doInBackground) 中的 AsynkTask 中执行所有这些操作。当我在我的模拟器中运行应用程序时...我收到运行时错误:执行 doInBackground 时发生错误。我跑了几次代码,但似乎无法找出问题所在。下面是我的代码...有人请帮助我!另外请让我知道如何改进这段代码......到目前为止它真的很乏味。

public class OpeningActivity extends Activity {

static final String PAGE_URL = "http://www.facebook.com/pages/Symbiosis-College-of-   Arts-Commerce-Confession/524808617560510";
static String title, imgSource, viewFormLink, viewFormEntry, formResponse, data;
static PrintWriter writer, formWriter, dfWriter;
static FileInputStream fis;
static File dataFile, confessionsPage, formFile;
Button setup;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_opening);
    setup = (Button) findViewById(R.id.btnSetup);

    setup.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            new getWebPage().execute(PAGE_URL);
        }
    });
}


public class getWebPage extends AsyncTask<String, Integer, String> {

protected void onPreExecute(String f) {
    // TODO Setting up variables
    f = "whatevs";
}

@Override
protected String doInBackground(String... params) {
    // TODO Auto-generated method stub
    DefaultHttpClient urlClient = new DefaultHttpClient();
    HttpGet getHtml = new HttpGet(PAGE_URL);
    ResponseHandler<String> resHandler = new BasicResponseHandler();
    try {
        String htmlPage = urlClient.execute(getHtml, resHandler);
                    lod.d("htmlpage", htmplPage);
        confessionsPage = new File("ConfessionsPage.html");
        confessionsPage.createNewFile();
        writer = new PrintWriter(confessionsPage, "UTF-8");
        writer.print(htmlPage.replace("<!--", "").replace("-->", ""));
        writer.flush();
        writer.close();

        Document doc = Jsoup.parse(confessionsPage, "UTF-8", "http://www.facebook.com/");
        title = doc.title().substring(0, doc.title().length() - 11);

        Elements imgSRC = doc.select("img[src$=.jpg]");
        for (Element element : imgSRC) {
            if (element.attr("class").equals("profilePic img")) {
                imgSource = element.attr("src");
            }
        }

        Elements links = doc.select("a[href*=google]");
        viewFormLink = null;
        for (Element element : links) {
            viewFormLink = element.attr("href");
        }
        viewFormLink = viewFormLink.replace("http://www.facebook.com/l.php?u=", "");
        int ampLOC = viewFormLink.indexOf("&");
        viewFormLink = viewFormLink.substring(0, ampLOC);
        viewFormLink = URLDecoder.decode(viewFormLink, "UTF-8");

        formResponse = viewFormLink.substring(0, (viewFormLink.length() - 8));
        formResponse = formResponse + "formResponse";
    } catch (ClientProtocolException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    DefaultHttpClient formClient = new DefaultHttpClient();
    HttpGet getForm = new HttpGet(viewFormLink);
    ResponseHandler<String> resHandler2 = new BasicResponseHandler();

    try {
        String formPage = formClient.execute(getForm, resHandler2);
        formFile = new File("FormPage.html");
        formFile.createNewFile();
        formWriter.write(formPage);
        formWriter.flush();
        formWriter.close();

        Document doc2 = Jsoup.parse(formFile, "UTF-8", "http://www.facebook.com");
        Elements entry = doc2.select("textarea[name^=entry]");
        viewFormEntry = entry.attr("name");

    } catch (ClientProtocolException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    dataFile = new File("DataFile");
    try {
        dataFile.createNewFile();
        dfWriter = new PrintWriter(dataFile);
        dfWriter.println(title);
        dfWriter.println();
        dfWriter.println(imgSource);
        dfWriter.println();
        dfWriter.println(viewFormLink);
        dfWriter.println();
        dfWriter.println(viewFormEntry);
        dfWriter.println();
        dfWriter.println(formResponse);

    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    try {
        fis = new FileInputStream(dataFile);
        byte [] dataArray = new byte [fis.available()];
        while (fis.read() != -1) {
            data = new String(dataArray);
        }
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    return data;
}

@Override
protected void onProgressUpdate(Integer... progress) {
    // TODO Auto-generated method stub

}

@Override
protected void onPostExecute(String result) {
    // TODO Auto-generated method stub
    Bundle dataBundle = new Bundle();
    dataBundle.putString("mydata", result);

    Intent intent = new Intent(OpeningActivity.this, Main.class);
    intent.putExtras(dataBundle);
    startActivity(intent);
}
}
}

我稍微更改了代码。我现在在我的 doInBackground 中返回数据字符串变量。我在清单文件中添加了互联网权限。 我仍然遇到同样的错误。下面是我的错误日志,只是为了方便:

05-27 10:36:25.995: E/AndroidRuntime(741): FATAL EXCEPTION: AsyncTask #1
05-27 10:36:25.995: E/AndroidRuntime(741): java.lang.RuntimeException: An error occured while executing doInBackground()
05-27 10:36:25.995: E/AndroidRuntime(741):  at android.os.AsyncTask$3.done(AsyncTask.java:299)
05-27 10:36:25.995: E/AndroidRuntime(741):  at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352)
05-27 10:36:25.995: E/AndroidRuntime(741):  at java.util.concurrent.FutureTask.setException(FutureTask.java:219)
05-27 10:36:25.995: E/AndroidRuntime(741):  at java.util.concurrent.FutureTask.run(FutureTask.java:239)
05-27 10:36:25.995: E/AndroidRuntime(741):  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
05-27 10:36:25.995: E/AndroidRuntime(741):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
05-27 10:36:25.995: E/AndroidRuntime(741):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
05-27 10:36:25.995: E/AndroidRuntime(741):  at java.lang.Thread.run(Thread.java:856)
05-27 10:36:25.995: E/AndroidRuntime(741): Caused by: java.lang.NullPointerException
05-27 10:36:25.995: E/AndroidRuntime(741):  at org.apache.http.impl.client.AbstractHttpClient.determineTarget(AbstractHttpClient.java:496)
05-27 10:36:25.995: E/AndroidRuntime(741):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:626)
05-27 10:36:25.995: E/AndroidRuntime(741):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:616)
05-27 10:36:25.995: E/AndroidRuntime(741):  at org.social.myconfessions.OpeningActivity$getWebPage.doInBackground(OpeningActivity.java:68)
05-27 10:36:25.995: E/AndroidRuntime(741):  at org.social.myconfessions.OpeningActivity$getWebPage.doInBackground(OpeningActivity.java:1)
05-27 10:36:25.995: E/AndroidRuntime(741):  at android.os.AsyncTask$2.call(AsyncTask.java:287)
05-27 10:36:25.995: E/AndroidRuntime(741):  at java.util.concurrent.FutureTask.run(FutureTask.java:234)
05-27 10:36:25.995: E/AndroidRuntime(741):  ... 4 more

【问题讨论】:

  • 提供完整的错误日志
  • 如果您需要在 onPostExecute 中使用“结果”,为什么还要返回 null?你有 INTERNET 权限吗?
  • 您从 doInBackground 返回的值是您将在 onPostExecute 中作为参数获得的值(在本例中为字符串结果)尝试修复此问题,看看是否会更好。
  • 你的活动的第 68 行是什么?
  • String htmlPage = urlClient.execute(getHtml, resHandler);

标签: java android android-asynctask apache-commons-httpclient background-thread


【解决方案1】:

你没有在这些初始化上指定任何变量

DefaultHttpClient urlClient = new DefaultHttpClient();
HttpGet getHtml = new HttpGet();
ResponseHandler<String> resHandler = new BasicResponseHandler();

String htmlPage = urlClient.execute(getHtml, resHandler); 没有任何值可以返回空的“新”变量;

试试这个:

DefaultHttpClient urlClient = new DefaultHttpClient();
HttpGet getHtml = new HttpGet(PAGE_URL);
ResponseHandler<String> resHandler = new BasicResponseHandler();

P.S :如果您想显示调试消息/logcat 消息,请尝试使用

Log.d("String Identifier", String_Variable);

例如,如果你想输出字符串变量htmlPage的内容,这样做:

Log.d("htmlPage", htmlPage);

【讨论】:

  • 感谢 reidzeibel!这是一个愚蠢的错误! PS>感谢lod调试信息!他们将来会帮助我很多!我现在收到一个新错误:@java line:76。 'Java.net.IOException。只读文件系统”。我不知道那是什么意思。请帮忙。谢谢
  • 我的第 76 行是:confessionPage.createNewFile();
  • 我认为你需要指定文件路径,因为Android文件系统有点复杂,你应该像这样指定文件:new File(getApplicationContext.getFilesDir(), "filename");
  • 我正在我的模拟器上测试这个仅供参考
  • 尝试阅读这篇关于在 android Emulator 中创建文件的帖子 ^^ --> stackoverflow.com/questions/3634626/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多