当前位置: 首页 > 知识库问答 >
问题:

Android-InputStreamReader不工作

宋高寒
2023-03-14

我想从网站获取一个字符串,并将其转换为数组。它在eclipse中工作,但如果我想在Android应用程序中使用它,它就不起作用了。我知道,这一定是一个愚蠢的错误,但我不知道它在哪里。

InternetHandler:

package de.blender4me.einkaufsliste;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.regex.Pattern;

public class internetHandler {

//Einkaufsplaner-API aufrufen
    public static String[] getList(){

        InputStream is = null;

        try
        {
          URL url = new URL("https://einkaufsplaner.blender4me.de/api.php?name=Username&pass=SuperSecretPass&addValue=&removeValue=");
          BufferedReader in = new BufferedReader(
          new InputStreamReader(url.openStream()));

          String Values = null;

          for(int i = 0; i < 4; ++i){
              Values = in.readLine();
          }
          in.close();

          String[] List = Values.split( Pattern.quote( ";" ) );
          return List;

        }
        catch ( Exception e ) {
          e.printStackTrace();
        }
        finally {
          if ( is != null )
            try { is.close(); } catch ( IOException e ) { }
        }
        String[] error = {"error"};
        return error;
    }
}

主要的

package de.blender4me.einkaufsliste;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;


public class MainActivity extends Activity {

//Widgets
Button addItem;



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

        //listView
        populateListView();

        //register Widgets
        addItem =(Button) findViewById(R.id.addItem);

        addItem.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                openDialog();
            }
        });
    }

@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;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();
    if (id == R.id.action_settings) {
        return true;
    }
    return super.onOptionsItemSelected(item);
}

//Alert
public void openDialog(){
    AlertDialog.Builder alert = new AlertDialog.Builder(this);

    alert.setTitle("Zur Einkaufsliste hinzufügen");
    alert.setMessage(" ");

    // Set an EditText view to get user input 
    final EditText input = new EditText(this);
    alert.setView(input);

    alert.setPositiveButton("Bestätigen", new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog, int whichButton) {
      String value = input.getText().toString();
      // Do something with value!
      }
    });

    alert.setNegativeButton("Abbrechen", new DialogInterface.OnClickListener() {
      public void onClick(DialogInterface dialog, int whichButton) {
        // Canceled.
      }
    });

    alert.show();
}

//listView erstellen
private void populateListView() {
        // Liste auslesen
        String[] values = internetHandler.getList();

        //Liste konvertieren
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 
                R.layout.listview_item, //Genutztes Layout
                values); //Genutzter Array

        //listView einstellen
        ListView list = (ListView) findViewById(R.id.listView);
        list.setAdapter(adapter);
    }
}

显示

<uses-sdk
    android:minSdkVersion="14"
    android:targetSdkVersion="19" />
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>


<application
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@android:style/Theme.Holo.Light.NoActionBar.Fullscreen"
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

它总是返回错误数组,但idk为什么:C

logcat:

HttpEngineering. sendRequest(HttpEngineering. java: 239)11-07 15:18:24.945: W/System. err(642): at libcore. net. http. HttpURLConnectionInpl. getACK(HttpURLConnectionInpl. java: 273)11-07 15:18:24.945: W/System. err(642): at libcore. net. http. HttpURLConnectionInpl. getInputStream(HttpURLConnectionInpl. java: 168)11-07 15:18:24.945: W/System. err(642): at libcore. net. http. HttpsURLConnectionInpl. getInputStream(HttpsURLConnectionInpl. java: 271)11-07 15:18:24.955: W/System. err(642): at java. net. URL. openStream(URL.MainActive. onCreate(MainActive. java: 37)11-07 15:18:24.955: W/System. err(642): at android. app. active. performCreate(Active. java: 5008)11-07 15:18:24.955: W/System. err(642): at android. app. Instrumentation. call ActivityOnCreate(Instrumentation. java: 1079)11-07 15:18:24.955: W/System. err(642): at android. app. ActivityThread. performLaunchActive(ActivityThread. java: 2023)11-07 15:18:24.965: W/System. err(642): at android. app. ActivityThread. handleLaunchActive(ActivityThread. java: 2084)11-07 15:18:24.965: W/System. err(642):Looper. lop(Looper. java: 137)11-07 15:18:24.965: W/System. err(642): at android. app. ActivityThread. main(ActivityThread. java: 4745)11-07 15:18:24.965: W/System. err(642): at java. lang.反射。方法。调用本机(本机方法)11-07 15:18:24.965: W/System. err(642): at java. lang.反射。方法。调用(方法。java: 511)11-07 15:18:24.975: W/System. err(642): at com. android. interal. os。ZygoteInit$MEodAndArgsCaller. run(ZygoteInit. java: 786)11-07 15:18:24.975: W/System. err(642): at com. andro

共有2个答案

斜和硕
2023-03-14

问题是您试图在应用程序的UI线程上执行HTTP请求。

您应该在AsyncTask中执行此操作。

丌官皓君
2023-03-14

你的问题在这里(在堆栈跟踪中):

android。操作系统。NetworkOnMainThreadException

你在主线程中发出请求,Android禁止这样做,以避免对用户界面进行过度处理(这样做会阻塞用户界面)。

改为使用AsyncTask。

AsyncTask从某物开始的示例:

private class LongOperation extends AsyncTask<Void, Void, String> {

    @Override
    protected String doInBackground(Void... params) {
        InternetHandler ih = new InternetHandler();
        String[] values = ih.getList();
    }

    @Override
    protected void onPostExecute(String result) {
        //Liste konvertieren
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 
            R.layout.listview_item, //Genutztes Layout
            values); //Genutzter Array

        //listView einstellen
        ListView list = (ListView) findViewById(R.id.listView);
        list.setAdapter(adapter);
    }

    @Override
    protected void onPreExecute() {}

    @Override
    protected void onProgressUpdate(Void... values) {}
}

用以下名称命名:

LongOperation lo = new LongOperation();
lo.execute();
 类似资料:
  • 主要内容:1 什么是Java InputStreamReader,2 Java InputStreamReader的构造方法,3 Java InputStreamReader的方法,4 Java InputStreamReader的例子1 什么是Java InputStreamReader InputStreamReader是从字节流到字符流的桥梁:它读取字节,并使用指定的字符集将它们解码为字符。它使用的字符集可以按名称指定,也可以明确指定,也可以接受平台的默认字符集。 2 Java Input

  • 问题内容: 我似乎无法确定任何区别和另外两个被初始化的方式。使用一个或另一个有什么好处吗?其他大多数文章都介绍了vs ,但与此相反。在我看来,它们都有相同的目的。 问题答案: 首先,可以处理所有输入流,而不仅仅是文件。其他示例是网络连接,类路径资源和ZIP文件。 其次,直到Java 11不允许您指定编码,而只使用平台默认编码,这使它几乎无用,因为当代码在具有不同平台默认编码的系统上运行时,使用它会

  • 问题内容: 使用over 的好处是什么,反之亦然。 这是一个实际的例子: 这是一个使用InputStreamReader的示例(显然是在InputStream的帮助下): Reader是否以特殊方式处理数据? 只是想让我了解Java 的整个流数据方面。 问题答案: 它们代表了一些不同的东西。 它是所有可能的字节 流 的祖先类,它本身没有用,但是所有子类(如您正在使用的子类)都非常适合处理二进制数据

  • 我不明白InputStream、InputStreamReader和BufferedReader到底是做什么的。它们都有一个read()方法,对于BufferedReader,还有readLine()。为什么我不能只使用InputStream或者只添加inputStreamReader呢?为什么我需要添加BufferedReader?我知道这与效率有关,但我不明白怎么做。 我一直在研究Buffer

  • 我需要你帮我拿这个充气机。从Activity3中,我需要获得Activity1中EditText中的内容。 例:在Activity1中,我写我的名字、电子邮件、ECC。在活动2中,我选择我的生日,在活动3中,我想看到两者。 所以我在Activity3中使用了LayoutInflater,但是当我将EditText解析为string时,字符串是空的。 谢了。

  • 这是负责将片段添加到后堆栈的函数: 当我点击后退按钮时,最后一个片段没有被加载(什么也没有发生)。 知道是什么导致的吗? 编辑:FragmentManager日志。 http://pastebin.com/mYnVdkLG 在我看来,我的应用程序似乎在两次保存第二个视图,而不是先保存第一个视图,然后再保存第二个视图。