java - Android,使用异步任务从 url 中获取文本

标签 java android url android-asynctask

是的,我认为就目前而言,您应该认为我是一个彻头彻尾的菜鸟,我有点不知所措。

我试图从几个部分教程中拼凑出我对此的理解,每个教程都涉及我想做的不同方面。

总而言之,我想做的就是从 URL 中读取文本以显示在 TextView 中,我的理解是自 3.0 更新以来我需要一个 AsyncTask 来执行此操作。

任何关于我出错的地方的帮助都会很棒,因为我不明白是什么导致了错误以及如何修复。

我确实知道 doInBackground 的 try 和 catch 中包含的代码在 3.0 更新之前可以自行运行。这是否也需要修改以与 Async 一起使用,但我不知道。

我还认为,一旦解决了这个问题,其他问题可能会出现,如果有人发现一些明显的问题,如果您能指出,我将不胜感激。

String Event;
TextView eventText;
TextView titleText;

String HTML;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.newevent);

    titleText = (TextView) findViewById(R.id.Title);
    eventText = (TextView) findViewById(R.id.Event);

    new eventupdate().execute();


}

public class eventupdate extends AsyncTask<String, Void, Void> {

    @Override
    protected Void doInBackground(String... url) {

        try {

            Thread.sleep(4000);                 

            HttpClient httpClient = new DefaultHttpClient();
            HttpContext localContext = new BasicHttpContext();
            HttpGet httpGet = new HttpGet(
                    "http://masterzangetsu.eu/Apps/rocksoctest"); // URL!
            HttpResponse response = httpClient.execute(httpGet,
                    localContext);
            String result = "";

            BufferedReader reader = new BufferedReader(
                    new InputStreamReader(response.getEntity().getContent()));

            String line = null;
            while ((line = reader.readLine()) != null) {
                result += line + "\n";
                HTML = result;
            }

        } catch (InterruptedException e) {

            e.printStackTrace();


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

        eventText.setText("" + HTML);

        // TODO Auto-generated method stub
        return null;
    }


}

LogCat 错误是:

W/dalvikvm(394): threadid=9: thread exiting with uncaught exception (group=0x40015560)
E/AndroidRuntime(394): FATAL EXCEPTION: AsyncTask #1
E/AndroidRuntime(394): java.lang.RuntimeException: An error occured while executing doInBackground()
E/AndroidRuntime(394):  at android.os.AsyncTask$3.done(AsyncTask.java:200)
E/AndroidRuntime(394):  at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
E/AndroidRuntime(394):  at java.util.concurrent.FutureTask.setException(FutureTask.java:125)
E/AndroidRuntime(394):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
E/AndroidRuntime(394):  at java.util.concurrent.FutureTask.run(FutureTask.java:138)
E/AndroidRuntime(394):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
E/AndroidRuntime(394):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
E/AndroidRuntime(394):  at java.lang.Thread.run(Thread.java:1019)

E/AndroidRuntime(394): Caused by: android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

E/AndroidRuntime(394):  at android.view.ViewRoot.checkThread(ViewRoot.java:2932)
E/AndroidRuntime(394):  at android.view.ViewRoot.requestLayout(ViewRoot.java:629)
E/AndroidRuntime(394):  at android.view.View.requestLayout(View.java:8267)
E/AndroidRuntime(394):  at android.view.View.requestLayout(View.java:8267)
E/AndroidRuntime(394):  at android.view.View.requestLayout(View.java:8267)
E/AndroidRuntime(394):  at android.view.View.requestLayout(View.java:8267)
E/AndroidRuntime(394):  at android.widget.ScrollView.requestLayout(ScrollView.java:1291)
E/AndroidRuntime(394):  at android.view.View.requestLayout(View.java:8267)
E/AndroidRuntime(394):  at android.widget.RelativeLayout.requestLayout(RelativeLayout.java:257)
E/AndroidRuntime(394):  at android.view.View.requestLayout(View.java:8267)
E/AndroidRuntime(394):  at android.widget.TextView.checkForRelayout(TextView.java:5521)
E/AndroidRuntime(394):  at android.widget.TextView.setText(TextView.java:2724)
E/AndroidRuntime(394):  at android.widget.TextView.setText(TextView.java:2592)
E/AndroidRuntime(394):  at android.widget.TextView.setText(TextView.java:2567)
E/AndroidRuntime(394):  at com.MasterZangetsu.kentrocksoc.nextEvent$eventupdate.doInBackground(nextEvent.java:81)
E/AndroidRuntime(394):  at com.MasterZangetsu.kentrocksoc.nextEvent$eventupdate.doInBackground(nextEvent.java:1)
E/AndroidRuntime(394):  at android.os.AsyncTask$2.call(AsyncTask.java:185)
E/AndroidRuntime(394):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)

最佳答案

这行在这里

 eventText.setText("" + HTML);

导致了您的问题。您不能从 doInBackground() 更新 UI。它必须在其他方法之一中完成或发送回主 Activity 方法。在这里你可以在 onPostExecute()

中完成

Read through the AyncTask Docs

有多种方法可以完成此操作,但您可以更改 AsyncTask 以将结果返回到 onPostExecute()

public class eventupdate extends AsyncTask<String, Void, String> // change last param

然后在doInBackground()中添加onPostExecute()方法并修改return语句

public class eventupdate extends AsyncTask<String, Void, String>

 @Override
 protected void onPostExecute(String result) {
        super.onPostExecute(result);
         eventText.setText("" + result);
}

 @Override
    protected String doInBackground(String... url) {
   // do your work
   return HTML;

关于java - Android,使用异步任务从 url 中获取文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15835357/

相关文章:

linux - 如何在 bash 脚本中对 url 进行编码?

java - 尝试在 @After 方法中使用 @Test 方法生成的图像

java - Jersey:处理 Restful HTTP PUT(更新)请求的最佳实践

java - 我无法在 spring mvc 中通过 ajax 下载文件而不在服务器中保存文件

java - 如何知道日期是否在前 x 分钟内?

java - SwitchCompat setTextOn() 和 setTextOff() 在运行时不起作用

Android 转换 : Go to other scene without animation on orientation change

java - Android GPS 速度警报

api - Runscope 联系主机 SSL 时出错

objective-c - Chrome 地址栏如何确定它是 URL 还是搜索字符串?