下一行的log输出了,上一行的settext为什么没显示出效果来。

乔安同 发布于 2013/09/12 22:51
阅读 601
收藏 1

关键代码是这样的:

Handler gethandler = new Handler(){
		public void handleMessage(android.os.Message msg) {
			output += "\n开始获取联网数据\n";
			textView.setText(output);
			Log.e("input", "开始获取联网数据\n");
			getinputstream();
		};
	};
联网获取数据是用的这种方式:

inputStream = url.openStream();
结果能在logcat中看到log信息,但是textview中显示不出效果来。

下面附上全部代码,也希望有人能对我的程序提些意见,小弟初学联网这一块,感觉好难,不知不觉程序就崩溃了,还是不报错的那种。

package com.example.trysomething;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.Menu;
import android.widget.TextView;

@SuppressLint("DefaultLocale")
public class MainActivity extends Activity {

	TextView textView;

	InputStream inputStream;
	String output;

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

		textView = (TextView) this.findViewById(R.id.t);

		ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
		NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
		
		if (networkInfo == null) {
			textView.setText("当前无法联网");
		}else {
			if (networkInfo.isAvailable()&&networkInfo.isConnected()) {
				if (networkInfo.getExtraInfo() == null) {
					textView.setText("wifi");
				}else {
					textView.setText(networkInfo.getExtraInfo().toLowerCase());
				}
				output = textView.getText().toString();
				new Thread(){
					public void run() {
						try {
							sleep(2000);
							gethandler.sendMessage(gethandler.obtainMessage());
							sleep(2000);
							outputhandler.sendMessage(outputhandler.obtainMessage());
						} catch (InterruptedException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
					};
				}.start();
			}else {
			textView.setText("当前无法连接");
			}
		}
		
}
	Handler gethandler = new Handler(){
		public void handleMessage(android.os.Message msg) {
			output += "\n开始获取联网数据\n";
			textView.setText(output);
			Log.e("input", "开始获取联网数据\n");
			getinputstream();
		};
	};
	Handler outputhandler = new Handler(){
		public void handleMessage(android.os.Message msg) {
			output += "开始输出数据\n";
			textView.setText(output);
			Log.e("input", "开始输出数据\n");
			outputStream(inputStream);
		};
	};


	public void getinputstream() {
		String string = "http://ftp121455.host181.web522.com/xiaoshanshi/daoyu.txt";
		output += "\n";
		try {
			URL url = new URL(string);
			try {
				
				//
				inputStream = url.openStream();
				
				
				
				Log.e("input", "联网获取数据成功\n");
				output += "联网获取数据成功\n";
				textView.setText(output);
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				Log.e("input", "联网获取数据失败\n");
				output += "联网获取数据失败\n";
				textView.setText(output);
			}
		} catch (MalformedURLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			output += "url failed\n";
		}
		textView.setText(output);
		
	}
	public void outputStream(InputStream inputStream) {
		InputStreamReader inputStreamReader;
		BufferedReader bufferedReader;
		StringBuffer stringBuffer = new StringBuffer();

		

		
		if (inputStream != null) {
			Log.e("input", "inputStream != null\n");
			
			inputStreamReader = new InputStreamReader(inputStream);
			bufferedReader = new BufferedReader(inputStreamReader);
			String line = new String();
			
			
			try {
				while ((line = bufferedReader.readLine()) != null) {
					stringBuffer.append(line);
					stringBuffer.append("\n");
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			output += stringBuffer;
			textView.setText(output);
		}else {
			
			Log.e("input", "数据为空\n");
			output += "数据为空\n";
			textView.setText(output);
			
		}
	}
}

加载中
0
kenping
kenping
又在主线程进行网络操作!
乔安同
乔安同
回复 @kenping : 你好,我想了下,你的意思是不是指的我的run是写在onCreat里面了?
乔安同
乔安同
回复 @kenping : 那该怎么改呢?我线程这块了解的不多,见过的有限个案例中大部分都是这么用的。
kenping
kenping
回复 @乔安同 : 你的代码有点自欺欺人,你创建的那个线程只是通知那两个Handler干活而已,而两个Handler都是在主线程创建,因此这两个Handler的执行实际都是在主线程,看你都有捕获错误,未必没出错?
乔安同
乔安同
回复 @kenping : 主线程是指的mainActivity吗?我创建了不调用的话也算吗?另外再次问下这会影响到我问的问题吗?
kenping
kenping
回复 @乔安同 : 你的Handler是在UI主线创建的!
下一页
0
苦行瓜
苦行瓜
这种问题,估计楼主的textview字体颜色和父布局的背景色 一致造成的,换一下test color试试。
乔安同
乔安同
……log完事inputstream获取完后是可以显示出来的,我很确定不是颜色问题
0
乔安同
乔安同
我知道了,和网络有关的,得写在线程里,不能写在handler里。
返回顶部
顶部