Android中的线程实现不起作用
Posted
技术标签:
【中文标题】Android中的线程实现不起作用【英文标题】:Implements of thread in Android doesn't work 【发布时间】:2015-11-25 15:49:28 【问题描述】:我正在编写一个android中的基本应用程序,该应用程序将通过php中的请求连接到mysql服务器,在Android Internet连接必须在不同的线程中进行,所以我创建了实现Runnable接口的类。
package com.company.opax.loginmysql;
import android.util.Log;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
/**
* Created by opax on 30.08.2015.
*/
public class HttpPostMethod implements Runnable
private String fileInHost;
private ArrayList<PostParameters> postParameterses;
private StringBuffer postResult;
public HttpPostMethod(String fileInHost, ArrayList<PostParameters> postParameterses)
this.fileInHost = fileInHost;
this.postParameterses = new ArrayList<PostParameters>(postParameterses);
public String getResult()
return postResult.toString();
@Override
public void run()
try
String urlParameters = generateParameters();
URLConnection conn = initializeUrlConnection();
OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream());
writer.write(urlParameters);
writer.flush();
String line;
BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
while ((line = reader.readLine()) != null)
postResult.append(line);
writer.close();
reader.close();
catch (IOException e)
Log.e("Exception", this.getClass().getName() + " name: " + e.toString());
private URLConnection initializeUrlConnection() throws MalformedURLException
URL url = new URL(fileInHost);
URLConnection conn;
try
conn = url.openConnection();
conn.setDoOutput(true);
catch(IOException e)
throw new MalformedURLException();
return conn;
private String generateParameters()
StringBuffer finishPostQuery = new StringBuffer();
for(PostParameters p : postParameterses)
finishPostQuery.append(p.getNameParam());
finishPostQuery.append("=");
finishPostQuery.append(p.getValueParam());
finishPostQuery.append("&");
if(!finishPostQuery.toString().equals("login=seba&password=pass&"))
throw new AssertionError("blad generatora zapytania: " + finishPostQuery);
return finishPostQuery.toString();
和登录类:
public class Login
private User user;
private final String paramLogin = "login";
private final String paramPass = "password";
public Login(User user)
this.user = user;
public boolean tryLogin()
try
ArrayList<PostParameters> postParameterses = new ArrayList<>();
postParameterses.add(new PostParameters(paramLogin, user.getUserName()));
postParameterses.add(new PostParameters(paramPass, user.getUserPass()));
HttpPostMethod httpPostMethod = new HttpPostMethod("http://blaba.php", postParameterses);
httpPostMethod.run();
Log.i("bla", httpPostMethod.getResult());
catch (Exception e)
Log.i("Exception", e.toString());
return false;
我正在尝试连接其他线程,但仍然出现错误:'android.os.NetworkOnMainThreadException' 对于我做错的所有建议,我将不胜感激。
【问题讨论】:
您正在实现Runnable
,它只是一个接口,不会使您的类成为线程。尝试扩展Thread
(HttpPostMethod extends Thread
) 并调用start
方法而不是run
。
我的建议是使用 Asynctask vogella.com/tutorials/AndroidBackgroundProcessing/article.html
【参考方案1】:
代替:
httpPostMethod.run();
做:
new Thread(httpPostMethod).start();
如果您的登录调用由于某些原因(超时、登录错误)而失败,您应该以某种方式向用户报告 - 这就是 AsyncTask 类的用途。它允许您在 doInBackkground 中运行后台代码,并且在网络操作结束后 - 在 onPostExecute
中,您可以执行 UI 相关的东西 - 例如显示错误/结果。
【讨论】:
【参考方案2】:我建议你两件事。 首先使用 AsyncTask 代替纯 java 线程。
但主要的建议是使用发出 http 请求的库。 我喜欢使用Retrofit,它可以为你处理所有请求和线程部分,但还有其他的。
【讨论】:
以上是关于Android中的线程实现不起作用的主要内容,如果未能解决你的问题,请参考以下文章