第3天(源码查看器)

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >


    <EditText
        android:id="@+id/et_url"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入URL" />


    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:layout_marginTop="30dp" >


        <TextView
            android:id="@+id/tv_content"
            android:layout_width="250dp"
            android:layout_height="wrap_content"
            android:text="内容" >
        </TextView>


        <Button
            android:id="@+id/button_view"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:onClick="view"
            android:text="查看" >
        </Button>
    </RelativeLayout>


</LinearLayout>



package com.example.sourcecode;


import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;


import android.app.Activity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.Menu;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;


public class MainActivity extends Activity {


    private EditText editTextUrl;


    private TextView textViewContent;


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


        editTextUrl = (EditText) findViewById(R.id.et_url);
        textViewContent = (TextView) findViewById(R.id.tv_content);
    }


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


    public void view(View view) {


        // 获取输入的URL
        String url = editTextUrl.getText().toString();
        if (TextUtils.isEmpty(url)) {
            Toast.makeText(getApplicationContext(), "URL不能为空", Toast.LENGTH_LONG).show();
            return;
        }


        // 根据URL设置源码内容
        setContent(url);


    }


    private void setContent(final String inputUrl) {


        new Thread() {
            @Override
            public void run() {


                try {


                    // 获取网络URL
                    URL url = new URL(inputUrl);


                    URLConnection conn = url.openConnection();
                    conn.setConnectTimeout(5000);


                    // 获取输入流
                    InputStream is = conn.getInputStream();


                    // 内存输出流
                    ByteArrayOutputStream baos = new ByteArrayOutputStream();


                    int temp;
                    while ((temp = is.read()) != -1) {
                        baos.write(temp);
                    }


                    final String content = baos.toString();
                    runOnUiThread(new Runnable() {


                        @Override
                        public void run() {
                            // 更新UI
                            textViewContent.setText(content);


                        }
                    });


                } catch (Exception e) {
                    e.printStackTrace();
                    Toast.makeText(getApplicationContext(), "Exception:" + e, Toast.LENGTH_LONG).show();
                }
            }
        }.start();


    }


}



使用ScrollView滚动视图来展示内容:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >


    <EditText
        android:id="@+id/et_url"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入URL" />


    <ScrollView
        android:layout_width="200dp"
        android:layout_height="300dp"
        android:scrollbars="vertical" >


        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="30dp" >


            <TextView
                android:id="@+id/tv_content"
                android:layout_width="250dp"
                android:layout_height="wrap_content"
                android:text="内容" >
            </TextView>
        </LinearLayout>
    </ScrollView>


    <Button
        android:id="@+id/button_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="view"
        android:text="查看" >
    </Button>


</LinearLayout>



扫描二维码关注公众号,回复: 2180662 查看本文章







问题1:
主线程不能访问网络等耗时的操作,必须在子线程执行。否则就会报错:NetworkOnMainThreadException




问题2:
子线程不能直接更新UI,可以使用runOnUiThread来实现。否则就会报错:




子线程执行完要更新UI的时候,我们又必须回到主线程来更新,实现这一功能常用的方法是执行Activity的runOnUiThread()方法。








问题3:
没有设置网络访问权限就会报这个错:
Permission denied (missing INTERNET permission?)


发现类似问题,我们应该在AndroidManifest.xml(清单文件)中添加如下行,允许网络访问权限就可以了。


<uses-permission android:name="android.permission.INTERNET" />



总结:①主线程不能访问网络等耗时操作

          ②子线程不能直接更新UI(可使用runOnUiThread)

          ③访问网络需要配置权限:<uses-permission android:name="android.permission.INTERNET" />

猜你喜欢

转载自blog.csdn.net/qq_34097912/article/details/80198942
今日推荐