首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android数据下载实验

Android数据下载实验
EN

Stack Overflow用户
提问于 2013-02-08 03:46:26
回答 5查看 124关注 0票数 0

我对Android相对来说是个新手,我正在尝试学习教程。

我用以下代码创建了一个小项目:

代码语言:javascript
复制
package com.example.revivaltimesv1;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;

import android.app.Activity;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity {

    private static final int LENGTH_LONG = 10;
    private TextView message;// = (TextView)findViewById(R.id.message);

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        message = (TextView)findViewById(R.id.message);

        Log.i("mine", "TESTING ... TESTING!!!");

        ConnectivityManager conManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = conManager.getActiveNetworkInfo();
        if( networkInfo != null && networkInfo.isConnected() ){
            Toast.makeText(this, "Established Network Connection!", LENGTH_LONG).show();
            String stringURL = "http://178.79.128.76/GTK/node/7";
            new DownloadStuff().execute(stringURL);
//          new test().execute();
            //message.setText("WORKING");
        }else{
            Toast.makeText(this, "No Network Connection!", LENGTH_LONG).show();
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

//}

/*    private class test extends AsyncTask<String, String, String>{
        @Override
        protected String doInBackground(String... params) {
            // TODO Auto-generated method stub
            return null;
        }
    }
*/
    private class DownloadStuff extends AsyncTask<String, String, String>{

        protected String doInBackground(String... url) {
            // TODO Auto-generated method stub
            Log.i("CHECK", "OUTSIDE");
            try{
                Log.i("CHECK", "SUCCESS: " + url[0]);
                downloadUrl(url[0]);
                Toast.makeText(getApplicationContext(), "WORKING !!!", LENGTH_LONG).show();
            }catch(IOException i){
                Log.i("CHECK", "NOT so successful");
                Toast.makeText(getApplicationContext(), "ERROR: unable to establish contact with URL", LENGTH_LONG).show();     
            }
            return null;
        }

        protected void onPostExecute(String result) {
            // TODO Auto-generated method stub
//          super.onPostExecute(result);
            message.setText("Hurray!");
        }

        // Given a URL, establishes an HttpUrlConnection and retrieves
        // the web page content as a InputStream, which it returns as
        // a string.
        private String downloadUrl(String myurl) throws IOException {
            InputStream is = null;
            // Only display the first 500 characters of the retrieved
            // web page content.
            int len = 500;

            try {
                URL url = new URL(myurl);
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                conn.setReadTimeout(10000 /* milliseconds */);
                conn.setConnectTimeout(15000 /* milliseconds */);
                conn.setRequestMethod("GET");
                conn.setDoInput(true);
                // Starts the query
                conn.connect();
                int response = conn.getResponseCode();
                Log.d("DEBUG_TAG", "The response is: " + response);
                is = conn.getInputStream();

                // Convert the InputStream into a string
                String contentAsString = readIt(is, len);
                return contentAsString;

            // Makes sure that the InputStream is closed after the app is
            // finished using it.
            } finally {
                if (is != null) {
                    is.close();
                } 
            }
        }
        public String readIt(InputStream stream, int len) throws IOException, UnsupportedEncodingException {
            Reader reader = null;
            reader = new InputStreamReader(stream, "UTF-8");        
            char[] buffer = new char[len];
            reader.read(buffer);
            return new String(buffer);
        }
    }

}

该应用程序工作简单,但随后崩溃给我以下反馈:

代码语言:javascript
复制
02-08 03:39:16.316: E/AndroidRuntime(5106): FATAL EXCEPTION: AsyncTask #1
02-08 03:39:16.316: E/AndroidRuntime(5106): java.lang.RuntimeException: An error occured while executing doInBackground()
02-08 03:39:16.316: E/AndroidRuntime(5106):     at android.os.AsyncTask$3.done(AsyncTask.java:200)
02-08 03:39:16.316: E/AndroidRuntime(5106):     at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
02-08 03:39:16.316: E/AndroidRuntime(5106):     at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
02-08 03:39:16.316: E/AndroidRuntime(5106):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
02-08 03:39:16.316: E/AndroidRuntime(5106):     at java.util.concurrent.FutureTask.run(FutureTask.java:137)
02-08 03:39:16.316: E/AndroidRuntime(5106):     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
02-08 03:39:16.316: E/AndroidRuntime(5106):     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
02-08 03:39:16.316: E/AndroidRuntime(5106):     at java.lang.Thread.run(Thread.java:1102)
02-08 03:39:16.316: E/AndroidRuntime(5106): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
02-08 03:39:16.316: E/AndroidRuntime(5106):     at android.os.Handler.<init>(Handler.java:121)
02-08 03:39:16.316: E/AndroidRuntime(5106):     at android.widget.Toast.<init>(Toast.java:68)
02-08 03:39:16.316: E/AndroidRuntime(5106):     at android.widget.Toast.makeText(Toast.java:231)
02-08 03:39:16.316: E/AndroidRuntime(5106):     at com.example.revivaltimesv1.MainActivity$DownloadStuff.doInBackground(MainActivity.java:74)
02-08 03:39:16.316: E/AndroidRuntime(5106):     at com.example.revivaltimesv1.MainActivity$DownloadStuff.doInBackground(MainActivity.java:1)
02-08 03:39:16.316: E/AndroidRuntime(5106):     at android.os.AsyncTask$2.call(AsyncTask.java:185)
02-08 03:39:16.316: E/AndroidRuntime(5106):     at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
02-08 03:39:16.316: E/AndroidRuntime(5106):     ... 4 more

我看了看错误堆栈的底部,但是.4似乎隐藏了与我的代码相关的部分--我想。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-02-08 03:51:11

实际上,这个错误在logcat:02-08 03:39:16.316: E/AndroidRuntime(5106): at com.example.revivaltimesv1.MainActivity$DownloadStuff.doInBackground(MainActivity.java:74)中显示得很清楚。

理想情况下,任何Toasts / UI函数都应该在onPostExecute()中完成。但是,如果您必须在doInBackground()中这样做,那么将它放在一个Runnable中,如代码所示。

代码语言:javascript
复制
Runnable run = new Runnable() {

    @Override
    public void run() {
        Toast.makeText(getApplicationContext(), "WORKING !!!", LENGTH_LONG).show();

    }
}; MainActivity.this.runOnUiThread(run);

阅读有关AsyncTasks在这里的更多信息,特别是题为The 4 Steps的部分

票数 1
EN

Stack Overflow用户

发布于 2013-02-08 03:51:42

您不能在非ui线程中显示Toast。

您可以向UI线程发送消息,并让UI线程处理该消息。

票数 1
EN

Stack Overflow用户

发布于 2013-02-08 03:53:00

您不能使用来自非UI线程的Toast。您可以显示来自onPostExecute()的吐司,因为它是从UI线程调用的,而不是doInBackground(),因为它在自己的线程中运行。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14765358

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档